[英]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.