Solución:
Su función funciona si especifica el valor del parámetro de tipo explícitamente:
val value = safeValueOf<TestEnum>("test")
Se supone que el código original también funciona, pero no funciona debido a un error en la implementación de la inferencia de tipos: https://youtrack.jetbrains.com/issue/KT-11218
Solución a prueba de choques
Crea una extensión y luego llama valueOf<MyEnum>("value")
. Si el tipo no es válido, obtendrá nulo y tendrá que manejarlo
inline fun <reified T : Enum<T>> valueOf(type: String): T? {
return try {
java.lang.Enum.valueOf(T::class.java, type)
} catch (e: IllegalArgumentException) {
null
}
}
Alternativamente, puede establecer un valor predeterminado, llamando valueOf<MyEnum>("value", MyEnum.FALLBACK)
y evitar una respuesta nula. Puede extender su enumeración específica para que el valor predeterminado sea automático
inline fun <reified T : Enum<T>> valueOf(type: String, default: T): T {
return try {
java.lang.Enum.valueOf(T::class.java, type)
} catch (e: IllegalArgumentException) {
default
}
}
O si quieres ambos, haz el segundo:
inline fun <reified T : Enum<T>> valueOf(type: String, default: T): T = valueOf<T>(type) ?: default
Desde Kotlin 1.1, es posible acceder a las constantes en una clase enum de forma genérica, usando las funciones enumValues () y enumValueOf ():
enum class RGB { RED, GREEN, BLUE }
inline fun <reified T : Enum<T>> printAllValues() {
print(enumValues<T>().joinToString { it.name })
}
printAllValues<RGB>() // prints RED, GREEN, BLUE
https://kotlinlang.org/docs/reference/enum-classes.html#working-with-enum-constants