我在java中有以下代码:
Enum getEnumValue(Class<?> enumClass, String value) {
return Enum.valueOf((Class<Enum>) enumClass, value);
}
如何在Kotlin中重写这个?
更新
enumValueOf<>()
函数在这种情况下不适用,因为我不知道实际的类型参数,我只有一个类型未知的Class<?>
对象(kotlin中为Class<*>
)和一个名称字符串。已知类为枚举:Class.isEnum
返回true。使用这两个输入,上面的java代码允许使用原始类型获取枚举的值。这正是我需要的,因为我对枚举的特定类型不感兴趣。但我无法弄清楚如何在kotlin中获得相同的结果。
答案 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")