You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 19:01:10