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
相关产品推荐
相关产品推荐

