如何从一个枚举类和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中得到相同的结果。

这是一个纯粹的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错误跟踪器中存在一个开放的问题 ,以支持与预定为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") 

您可以在您的课堂中使用下面的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

老答案:

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

Kotlin有一个内置的功能:

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