Kotlin 中的 Enum.valueOf

新手上路,请多包涵

有没有办法在没有反射的情况下在 Kotlin 中完成这样的工作?

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

由于以下原因,下面的示例无法编译:

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

enum class TestEnum

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

原文由 AndroidEx 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

如果您明确指定类型参数值,您的函数将起作用:

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

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

原文由 yole 发布,翻译遵循 CC BY-SA 3.0 许可协议

碰撞安全解决方案

创建一个扩展,然后调用 valueOf<MyEnum>("value") 。如果类型无效,您将得到 null 并且必须处理它

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

原文由 Gibolt 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题