如何从Kotlin中的枚举类和字符串获取原始类型的枚举值

Eug*_*ene 1 generics enums kotlin

我在Java中有以下代码:

Enum getEnumValue(Class<?> enumClass, String value) {
    return Enum.valueOf((Class<Enum>) enumClass, value);
}
Run Code Online (Sandbox Code Playgroud)

如何用Kotlin重写它?

更新资料

enumValueOf<>()函数在这种情况下不适用,因为我不知道实际的类型参数,我只有一个Class<?>类型未知的对象(Class<*>在kotlin中)和一个名称字符串。已知该类为枚举: Class.isEnum返回true。使用这两个输入,上面的Java代码允许获取具有原始类型的枚举的值。这正是我所需要的,因为我对枚举的特定类型不感兴趣。但是我不知道如何在kotlin中获得相同的结果。

Kir*_*man 5

这是纯Kotlin版本:

@Suppress("UNCHECKED_CAST")
fun getEnumValue(enumClass: Class<*>, value: String): Enum<*> {
    val enumConstants = enumClass.enumConstants as Array<out Enum<*>>
    return enumConstants.first { it.name == value }
}
Run Code Online (Sandbox Code Playgroud)

请注意,它的效率不如Java版本。java.lang.Enum.valueOf使用缓存的数据结构,而此版本需要创建一个新的数组进行迭代。这个版本也是O(n),而Java版本是O(1),因为它在后台使用了字典。

Kotlin错误跟踪器中存在一个开放性问题,以支持与Java相同的代码(计划于1.3版)。

这是解决通用类型问题的一个非常丑陋的技巧:

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)
}
Run Code Online (Sandbox Code Playgroud)

快速测试表明它正在工作,但我不会依赖它。


如果可以使用通用类型,则可以使用内置功能enumValueOf(另请参见http://kotlinlang.org/docs/reference/enum-classes.html#working-with-enum-constants):

enum class Color {
    Red, Green, Blue
}

enumValueOf<Color>("Red")
Run Code Online (Sandbox Code Playgroud)