如何从一个枚举类和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")