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

时间:2017-09-26 00:58:52

标签: generics enums kotlin

我在java中有以下代码:

Enum getEnumValue(Class<?> enumClass, String value) {
    return Enum.valueOf((Class<Enum>) enumClass, value);
}

如何在Kotlin中重写这个?

更新

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

3 个答案:

答案 0 :(得分: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 }
}

请注意,它不如Java版本有效。 java.lang.Enum.valueOf使用缓存的数据结构,而此版本需要创建一个新的数组来迭代。此版本也是O(n),Java版本是O(1),因为它使用了引擎盖下的字典。

Kotlin bug跟踪器中有一个open issue支持与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)
}

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

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

enum class Color {
    Red, Green, Blue
}

enumValueOf<Color>("Red")

答案 1 :(得分:1)

您可以在类中使用以下Kotlin代码来获取java代码:

Kotlin功能代码:

private inline fun <reified T : kotlin.Enum<T>> getEnumValue(type: String?): T? {
    return java.lang.Enum.valueOf(T::class.java, type)
}

示例:

internal enum class MyEnum {
    MIDDLE_NAME
}
internal enum class MyEnumTwo {
    FIRST_NAME
}
internal enum class MyEnumThree {
    LAST_NAME
}


private fun demo(){

    System.out.println(getEnumValue<MyEnumTwo>("FIRST_NAME"))
    System.out.println(getEnumValue<MyEnum>("MIDDLE_NAME"))
    System.out.println(getEnumValue<MyEnumThree>("LAST_NAME"))

}

<强>输出:

System.out:FIRST_NAME

System.out:MIDDLE_NAME

System.out:LAST_NAME

旧答案:

        fun getEnumValue(enumClass:Class&lt; &gt;,value:String):Enum&lt; &gt; {           返回Enum.valueOf&gt;&gt;(enumClass为Class&gt;&gt;,value)        }

答案 2 :(得分:0)

Kotlin具有内置功能:

enum class Fruits {
    APPLE,
    ORANGE,
    BANANA
}

Fruits.valueOf("APPLE")