您可以将枚举的类作为构造函数参数传递并通过enumConstants 访问枚举值:
class SegmentController<E : Enum<E>>(private val clazz: Class<E>) {
fun getEnumForOrdinal(ordinal: Int): E {
return clazz.enumConstants[ordinal]
}
fun getOrdinalForEnum(e: Enum<E>): Int {
return e.ordinal
}
}
enum class SEGMENTS {A, B, C}
fun main() {
val controller = SegmentController(SEGMENTS::class.java)
println(controller.getOrdinalForEnum(SEGMENTS.B))
println(controller.getEnumForOrdinal(1))
}
或者,您可以使用reified 类型参数E 将getEnumForOrdinal 定义为inline 函数,并使用enumValues 访问枚举值:
class SegmentController<E : Enum<E>>() {
inline fun <reified E : Enum<E>> getEnumForOrdinal(ordinal: Int): E {
return enumValues<E>()[ordinal]
}
fun getOrdinalForEnum(e: Enum<E>): Int {
return e.ordinal
}
}
enum class SEGMENTS {A, B, C}
fun main() {
val controller = SegmentController<SEGMENTS>()
println(controller.getOrdinalForEnum(SEGMENTS.B))
println(controller.getEnumForOrdinal<SEGMENTS>(1))
}
另请参阅:https://kotlinlang.org/docs/reference/enum-classes.html#working-with-enum-constants
reified 关键字的精彩解释由 answer 给出。
我希望 E.values() 可用,但它不在
泛型类?
values() 方法在Enum class 中不可用。