为何无法为Kotlin枚举类编写扩展函数?
Kotlin枚举类扩展函数编写错误的原因及修正方案
你遇到的问题主要是两个核心错误导致的,后续的重载歧义、类型推断错误都是连锁反应:
扩展函数的接收者类型不对:你定义的
fun Test.printAllValues()是给枚举实例添加的扩展方法,而非枚举类本身。所以直接用Test.printAllValues()调用时,编译器找不到这个方法——因为它属于单个枚举对象,不是类级别的方法,这就出现了Unresolved reference: printAllValues错误。values()方法调用对象错误:枚举类的
values()是类级别的工具方法,必须通过枚举类名(比如Test.values())调用,枚举实例并没有这个方法。你在扩展函数里写this.values(),这里的this是枚举实例,自然会报Unresolved reference: values错误。
两种修正方案
方案一:给枚举类的伴生对象写扩展(支持类级调用)
Kotlin枚举类默认会生成伴生对象,我们可以给这个伴生对象写扩展函数,这样就能用Test.printAllValues()直接调用:
enum class Test { TestOne, TestTwo } fun Test.Companion.printAllValues() { Test.values().forEach { println(it) } } fun main() { Test.printAllValues() // 正常运行,输出TestOne、TestTwo }
方案二:保留实例级扩展,通过枚举对象调用
如果要保留实例级的扩展函数,需要通过具体的枚举实例调用,同时修正values()的调用方式:
enum class Test { TestOne, TestTwo } fun Test.printAllValues() { Test.values().forEach { println(it) } } fun main() { Test.TestOne.printAllValues() // 通过枚举实例调用,正常输出 }
内容的提问来源于stack exchange,提问作者Vencat
相关产品推荐
相关产品推荐

