Eug*_*ene 1 generics enums kotlin
我在Java中有以下代码:
Enum getEnumValue(Class<?> enumClass, String value) {
return Enum.valueOf((Class<Enum>) enumClass, value);
}
Run Code Online (Sandbox Code Playgroud)
如何用Kotlin重写它?
更新资料
enumValueOf<>()函数在这种情况下不适用,因为我不知道实际的类型参数,我只有一个Class<?>类型未知的对象(Class<*>在kotlin中)和一个名称字符串。已知该类为枚举: 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 }
}
Run Code Online (Sandbox Code Playgroud)
请注意,它的效率不如Java版本。java.lang.Enum.valueOf使用缓存的数据结构,而此版本需要创建一个新的数组进行迭代。这个版本也是O(n),而Java版本是O(1),因为它在后台使用了字典。
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)
}
Run Code Online (Sandbox Code Playgroud)
快速测试表明它正在工作,但我不会依赖它。
如果可以使用通用类型,则可以使用内置功能enumValueOf(另请参见http://kotlinlang.org/docs/reference/enum-classes.html#working-with-enum-constants):
enum class Color {
Red, Green, Blue
}
enumValueOf<Color>("Red")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3240 次 |
| 最近记录: |