如何让Kotlin枚举直接作为String类型使用?
解决方法
你不需要自定义额外的字段,Kotlin枚举本身就提供了name属性,值就是枚举常量的字符串名称,直接用它就能省去.v的步骤:
enum class Things{ FIRST, SECOND, THIRD } // 直接调用name属性 containsThings[Things.FIRST.name]
如果觉得name这个名称太长,还可以给枚举类加个扩展属性简化调用:
enum class Things{ FIRST, SECOND, THIRD } // 定义扩展属性,名称可以随便取,比如用v或者s val Things.v get() = name // 使用时和你原来的写法一致,但不用在枚举里重复定义字符串值 containsThings[Things.FIRST.v]
要是你想让枚举实例能直接当作String用(不用加任何后缀),因为String是final类无法被继承,只能通过隐式转换实现,但这种方式会降低代码可读性,不推荐:
enum class Things{ FIRST, SECOND, THIRD } // 定义隐式转换函数 operator fun Things.unaryPlus(): String = this.name // 使用时加个+符号 containsThings[+Things.FIRST]
另外,如果你的容器(比如containsThings)接受CharSequence类型的key,还可以让枚举实现CharSequence接口,直接传入枚举实例:
enum class Things : CharSequence { FIRST, SECOND, THIRD; override val length: Int get() = name.length override fun get(index: Int): Char = name[index] override fun subSequence(startIndex: Int, endIndex: Int): CharSequence = name.subSequence(startIndex, endIndex) override fun toString(): String = name } // 当Map的key是CharSequence时直接用 containsThings[Things.FIRST]
内容的提问来源于stack exchange,提问作者Felix
相关产品推荐
相关产品推荐

