簡體   English   中英

Kotlin 中的 Enum.valueOf

[英]Enum.valueOf in Kotlin

有沒有辦法在沒有反射的情況下在 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? 不滿意:推斷類型TestEnum? 不是kotlin.Enum<TestEnum?>的子類型

enum class TestEnum

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

如果您明確指定類型參數值,您的函數將起作用:

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

原始代碼應該也能工作,但由於類型推斷實現中的錯誤而無法工作: https : //youtrack.jetbrains.com/issue/KT-11218

碰撞安全解決方案

創建一個擴展,然后調用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

從 Kotlin 1.1 開始,可以使用 enumValues() 和 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

我通常會在枚舉中添加這樣的東西:

companion object {
    fun from(type: String?): TestEnum = values().find { it.name == type } ?: DEFAULT
}

這將是一個干凈的電話

val value = TestEnum.from("test")

當然你可以讓它返回null

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM