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

Kotlin中如何传递任意枚举作为函数参数并访问其自定义属性

Kotlin中如何传递任意枚举作为函数参数并访问其自定义属性

嗨,我来帮你搞定这个问题~你遇到的核心问题是:原来的泛型函数只约束了参数是枚举类(Enum<E>),但枚举类本身并没有MyString这个自定义属性,所以编译器根本不知道所有传入的枚举都有这个属性,直接替换name肯定会报错。

解决思路很简单,我们可以用接口来统一约束那些带有自定义属性的枚举类,这样泛型函数就能安全地访问这些属性了。具体步骤如下:

1. 定义一个统一的接口

先创建一个接口,用来标记那些带有自定义字符串属性的枚举类:

interface HasCustomString {
    val myString: String
}

(这里用小驼峰myString是Kotlin的命名规范,你也可以保留原来的MyString,只要保持代码内命名一致就行)

2. 修改枚举类实现这个接口

让需要被函数处理的枚举类实现上面的接口,把你的自定义属性对应到接口的属性:

enum class Status {
    OPEN, CLOSED
}

enum class Weekday(override val myString: String) : HasCustomString {
    WORKDAY("str1"),
    DAYOFF("str2")
}

这里Weekday通过override关键字,把构造参数里的字符串绑定到接口的myString属性上。

3. 修改泛型函数的约束

更新函数的泛型约束,让它不仅要求参数是枚举类,还要求实现HasCustomString接口:

fun <E : Enum<E> & HasCustomString> methodWithKotlinEnumAsParameter(arg: E) {
    println(arg.myString)
}

现在调用methodWithKotlinEnumAsParameter(Weekday.DAYOFF),就会打印出str2啦!

额外:兼容没有自定义属性的枚举

如果你的函数需要同时处理有自定义属性和没有的枚举(比如Status),可以加个判断逻辑,灵活处理两种情况:

fun <E : Enum<E>> methodWithKotlinEnumAsParameter(arg: E) {
    when (arg) {
        is HasCustomString -> println(arg.myString)
        else -> println(arg.name)
    }
}

这样调用methodWithKotlinEnumAsParameter(Status.OPEN)会打印OPEN,调用methodWithKotlinEnumAsParameter(Weekday.DAYOFF)会打印str2,完美兼顾两种场景~

备注:内容来源于stack exchange,提问作者ragim_w

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 12:37:58