如何在Kotlin中编写接受实现接口的任意枚举的泛型转换函数?
可行,以下是实现方案
要实现通用的枚举转SelectField泛型函数,需要通过泛型约束同时限定类型既是枚举类又实现了UserFriendly接口,具体实现如下:
1. 定义接口与枚举类
保持你已有的UserFriendly接口和实现它的枚举类:
interface UserFriendly { val userFriendly: String } enum class TestGroup(override val userFriendly: String) : UserFriendly { A("分组A"), B("分组B") } enum class Status(override val userFriendly: String) : UserFriendly { ACTIVE("启用"), INACTIVE("禁用") }
2. 定义SelectField类
class SelectField( val value: String, /** 提交的值,使用枚举name作为标识符 */ val text: String /** 人性化显示文本 */ )
3. 编写泛型转换函数
通过where子句给泛型参数T添加双重约束:必须是Enum<T>(保证能获取枚举的name属性),同时必须实现UserFriendly(保证能获取userFriendly属性):
fun <T> genericTransform(values: Array<T>): List<SelectField> where T : Enum<T>, T : UserFriendly { return values.map { SelectField( value = it.name, text = it.userFriendly ) } }
4. 调用示例
直接传入任意实现了UserFriendly的枚举的values()数组即可:
fun main() { val testGroupFields = genericTransform(TestGroup.values()) val statusFields = genericTransform(Status.values()) // 输出示例 testGroupFields.forEach { println("${it.value} -> ${it.text}") } // 打印结果:A -> 分组A;B -> 分组B }
为什么原写法不可行?
你最初尝试的Array<Enum<UserFriendly>>是错误的,因为Kotlin中枚举类的父类是Enum<自身类型>(比如TestGroup的父类是Enum<TestGroup>),而非Enum<UserFriendly>。通过where子句的双重约束,才能正确限定类型同时满足枚举和接口的要求。
内容的提问来源于stack exchange,提问作者therealsyh
相关产品推荐
相关产品推荐

