我在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错误跟踪器中有一个open issue支持与Java计划的1.3中相同的代码。

这是一个真丑陋的 hack,可以解决通用类型问题:
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")

08-18 05:16
查看更多