gpt4 book ai didi

generics - 如何从 kotlin 中的枚举类和字符串获取原始类型的枚举值

转载 作者:行者123 更新时间:2023-12-02 21:55:26 24 4
gpt4 key购买 nike

我在java中有以下代码:

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

如何用 Kotlin 重写它?

更新

enumValueOf<>()函数在这种情况下不适用,因为我不知道实际的类型参数,我只有 Class<?>具有未知类型的对象(在 kotlin 中为 Class<*>)和名称字符串。该类已知为枚举:Class.isEnum返回真。使用这两个输入,上面的 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),因为它在底层使用了字典。

有一个open issue在 Kotlin 错误跟踪器中支持与 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")

关于generics - 如何从 kotlin 中的枚举类和字符串获取原始类型的枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46416273/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com