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

我在java中有以下代码:

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

如何在Kotlin中重写?

更新

enumValueOf()函数不适用于这种情况,因为我不知道实际的types参数,我只有一个Class具有未知types的对象(kotlin中的Class )和一个名称字符串。 该类被称为枚举: Class.isEnum返回true。 使用这两个输入,上面的java代码可以获得原始types的枚举值。 这正是我所需要的,因为我对枚举的具体types不感兴趣。 但我无法弄清楚如何在kotlin中得到相同的结果。

这是一个纯粹的Kotlin版本:

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

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

Kotlin错误跟踪器中存在一个开放的问题 ,以支持与预定为1.3的Java相同的代码。

这是一个非常丑陋的黑客解决genericstypes问题:

 private enum class Hack fun getEnumValue(enumClass: Class<*>, value: String): Enum<*> { return helper(enumClass, value) } private fun >helper(enumClass: Class<*>, value: String): Enum<*> { return java.lang.Enum.valueOf(enumClass as Class, value) } 

一个快速测试表明,它的工作,但我不会依靠它。


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

 enum class Color { Red, Green, Blue } enumValueOf("Red") 

您可以在您的课堂中使用下面的Kotlin代码来获取java代码:

Kotlinfunction代码:

 private inline fun > 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("FIRST_NAME")) System.out.println(getEnumValue("MIDDLE_NAME")) System.out.println(getEnumValue("LAST_NAME")) } 

输出:

System.out:FIRST_NAME

System.out:MIDDLE_NAME

System.out:LAST_NAME

老答案:

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

Kotlin有一个内置的function:

 enum class Fruits { APPLE, ORANGE, BANANA } Fruits.valueOf("APPLE")