2017-09-26 90 views
1

一个字符串我在java中下面的代码:如何从枚举类的原始类型的枚举值和科特林

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

如何在科特林改写呢?

更新

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

回答

1

这里是一个纯粹的科特林版本:

@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错误跟踪程序中有一个open issue,以支持与预定为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") 
+0

我知道这个功能,但它不适用于这种情况。我已经更新了这个问题。 – Eugene

+0

非常感谢!性能在这里不受关注 - 代码在应用程序启动过程中执行一次,因此该解决方案正是我所需要的。 – Eugene

1

您可以在课堂上使用下面科特林代码Java代码:

科特林功能代码:

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")) 

} 

输出:

系统.out:FIRST_NAME

的System.out:MIDDLE_NAME

的System.out:LAST_NAME

老答案:

乐趣getEnumValue(enumClass:<类>,值:字符串):枚举<> {enum.valueOf >>(enumClass as Class >>,value) }

+0

这几乎是标准的'enumValueOf <>()'函数所做的,但那不是我所需要的。我澄清了这个问题。 – Eugene

0

科特林有一个内置功能:

enum class Fruits { 
    APPLE, 
    ORANGE, 
    BANANA 
} 

Fruits.valueOf("APPLE")