这里是一个纯粹的科特林版本:
@Suppress("UNCHECKED_CAST")
fun getEnumValue(enumClass: Class<*>, value: String): Enum<*> {
val enumConstants = enumClass.enumConstants as Array<out Enum<*>>
return enumConstants.first { it.name == value }
}
注意,它并不像Java版本那样高效。 java.lang.Enum.valueOf
使用缓存的数据结构,而这个版本需要创建一个新的数组迭代。此版本是O(n),因为Java版本是O(1),因为它使用引擎盖下的字典。
Kotlin错误跟踪程序中有一个open issue,以支持与预定为1.3的Java中相同的代码。
这里是一个真难看黑客要解决的一般类型的问题:
private enum class Hack
fun getEnumValue(enumClass: Class<*>, value: String): Enum<*> {
return helper<Hack>(enumClass, value)
}
private fun <T : Enum<T>>helper(enumClass: Class<*>, value: String): Enum<*> {
return java.lang.Enum.valueOf(enumClass as Class<T>, value)
}
快速测试表明,它的工作,但我不会依赖它。
如果泛型类型是可用的,你可以使用内置的功能enumValueOf
(见http://kotlinlang.org/docs/reference/enum-classes.html#working-with-enum-constants):
enum class Color {
Red, Green, Blue
}
enumValueOf<Color>("Red")
我知道这个功能,但它不适用于这种情况。我已经更新了这个问题。 – Eugene
非常感谢!性能在这里不受关注 - 代码在应用程序启动过程中执行一次,因此该解决方案正是我所需要的。 – Eugene