Enum.valueOf in Kotlin

2022-09-01 14:19:13

有没有办法在没有反射的情况下在Kotlin中制作这样的东西?

inline fun <reified T : kotlin.Enum<T>> safeValueOf(type: String?): T? {
    return java.lang.Enum.valueOf(T::class.java, type)
}

以下示例由于以下原因而无法编译:

不满足 T in 绑定的类型参数:推断的类型不是inline fun <reified T : kotlin.Enum<T>> safeValueOf(type: kotlin.String?): T?TestEnum?kotlin.Enum<TestEnum?>

enum class TestEnum

fun main() {
    val value: TestEnum? = safeValueOf("test")
}

答案 1

如果显式指定类型参数值,则函数将正常工作:

val value = safeValueOf<TestEnum>("test")

原始代码也应该可以正常工作,但由于类型推断实现中的错误而无法正常工作:https://youtrack.jetbrains.com/issue/KT-11218


答案 2

防撞解决方案

创建分机,然后致电 。如果类型无效,您将获得 null 并且必须处理它valueOf<MyEnum>("value")

inline fun <reified T : Enum<T>> valueOf(type: String): T? {
    return try {
        java.lang.Enum.valueOf(T::class.java, type)
    } catch (e: IllegalArgumentException) {
        null
    }
}

或者,您可以设置默认值,调用 并避免空响应。您可以扩展您的特定枚举,使默认值为自动valueOf<MyEnum>("value", MyEnum.FALLBACK)

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
    }
}

或者,如果您两者都想要,请创建第二个:

inline fun <reified T : Enum<T>> valueOf(type: String, default: T): T = valueOf<T>(type) ?: default