Kotlin扩展为下一个枚举值没有反射

我写了一个Kotlin扩展,为枚举值添加next() 。 但有没有更好的方法来做到这一点?

 fun <T : Enum<*>> T.next(): T { val values = this::class.java.getEnumConstants() return if (this.ordinal < values.size - 1) values[this.ordinal + 1] else values[0] } enum class Color {Red, Yellow, Green} Color.Red.next() //Yellow 
  1. 我可以做到没有反射?
  2. 如果没有,如何用科特林思考做到这一点?

该想法是从枚举值迭代到下一个。 但是只有一个特定的值,而不是整个枚举values()列表。 我想要防止的事情是将以下添加到每个枚举类型:

 fun next() = if (this.ordinal == Color.values().size - 1) Color.values()[0] else Color.values()[this.ordinal + 1] 

你可以在不使用Kotlin 1.1(现在可以试用1.1 RC版本 )的情况下使用enumValues<T>()来反省,因为它不是在内部使用反射,因为它是在呼叫站点内联的,而相应的enum类型在编译时被放置在结果代码中。 例:

 inline fun <reified T: Enum<T>> T.next(): T { val values = enumValues<T>() val nextOrdinal = (ordinal + 1) % values.size return values[nextOrdinal] } 

(这个代码的演示) | inlineenumValues<T>()是必需的,因为enumValues<T>()已经被reified T

与Kotlin 1.0.6一起使用的另一种方法(但仍使用Java反射中的getDeclaringClass() ):

 fun <T: Enum<T>> T.next(): T { val values = declaringClass.enumConstants val nextOrdinal = (ordinal + 1) % values.size return values[nextOrdinal] }