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

如何用泛型将枚举的rawValue匹配方法抽象到接口中?

Kotlin枚举通用值匹配方法的接口抽象方案

直接按你给出的接口伴生对象方案不可行,原因是Kotlin接口的伴生对象无法直接访问实现类的枚举entries与rawValue,且泛型约束无法正确关联枚举类与原始值类型。以下是可行的实现方案:

1. 定义统一暴露原始值的接口

先定义一个接口让所有需要匹配原始值的枚举实现,确保它们都拥有rawValue属性:

interface RawValueEnum<E> {
    val rawValue: E
}

2. 实现通用的枚举匹配方法

通过泛型扩展函数实现通用的getCaseBy,利用reified泛型获取枚举实例列表,同时通过交叉类型约束限制仅实现RawValueEnum的枚举可以使用:

inline fun <reified T : Enum<T> & RawValueEnum<E>, E> T.Companion.getCaseBy(value: E): T? {
    return enumValues<T>().firstOrNull { it.rawValue == value }
}

3. 枚举类实现接口

只需要让枚举实现RawValueEnum并指定原始值类型即可:

enum class Foo(override val rawValue: Int) : RawValueEnum<Int> {
    FIRST(1),
    SECOND(2)
}

4. 调用方式

完全符合你期望的调用形式:

val fooInstance = Foo.getCaseBy(1) // 返回FIRST实例

方案说明

  • 借助reified泛型,我们可以在扩展函数中直接获取枚举的所有实例(enumValues<T>())
  • 交叉类型Enum<T> & RawValueEnum<E>确保只有枚举类且实现了原始值接口的类型才能使用该方法,满足你的约束要求
  • 每个枚举仅需实现一次接口,无需重复编写getCaseBy方法,达到了代码复用的目的

内容的提问来源于stack exchange,提问作者William Hu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 12:50:03