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

如何用Kotlin泛型in/out替换Any处理枚举列表?

用Kotlin泛型实现支持多独立枚举类的通用函数

针对你遇到的多个独立枚举类的场景,有两种泛型实现方案,可根据函数是否需要访问枚举的value属性来选择:

方案1:仅约束为枚举类型(无需访问value属性)

如果calcList函数只需要处理枚举实例本身,不需要读取它的value字段,直接给泛型T加上枚举类型约束即可:

// 泛型T约束为任意枚举类型
fun <T : Enum<T>> calcList(list: List<Pair<T, String>>) {
    // 示例逻辑:遍历列表输出枚举名和对应字符串
    list.forEach { (enumItem, desc) ->
        println("枚举项:${enumItem.name},描述:$desc")
    }
}

调用calcList(l1)和calcList(l2)时,Kotlin会自动推导T的具体类型(As或Bs),既保留了类型安全性,又避免了使用Any带来的类型模糊问题。

方案2:约束为带value属性的类型(需访问value属性)

如果函数需要读取枚举的value字段,由于枚举类无法继承类,但可以实现接口,我们可以先定义一个统一的接口:

// 定义包含value属性的接口
interface ValueHolder {
    val value: String
}

然后让所有枚举类实现这个接口:

enum class As(override val value: String) : ValueHolder {
    A1("a1"),
    A2("a2"),
    A3("a3"),
}

enum class Bs(override val value: String) : ValueHolder {
    B1("b1"),
    B2("b2"),
}

最后给泛型T加上该接口的约束,这样函数里就能安全访问value属性了:

fun <T : ValueHolder> calcList(list: List<Pair<T, String>>) {
    // 示例逻辑:输出枚举的value和对应字符串
    list.forEach { (enumItem, desc) ->
        println("枚举value:${enumItem.value},描述:$desc")
    }
}

后续新增的Cs、Ds等枚举类,只要实现ValueHolder接口,就能直接传入calcList函数,扩展性拉满。


内容的提问来源于stack exchange,提问作者Ralf Wickum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 23:47:03