2017-09-26 125 views
1

一個字符串我在java中下面的代碼:如何從枚舉類的原始類型的枚舉值和科特林

Enum getEnumValue(Class<?> enumClass, String value) { 
    return Enum.valueOf((Class<Enum>) enumClass, value); 
} 

如何在科特林改寫呢?

更新

enumValueOf<>()功能並不適用於這種情況,因爲我不知道實際的類型參數,我只有與未知類型(Class<*>在科特林)和一個名稱字符串Class<?>對象。該類已知爲枚舉:Class.isEnum返回true。使用這兩個輸入,上面的java代碼允許使用原始類型獲取enum的值。這正是我需要的,因爲我對枚舉的具體類型不感興趣。但我無法弄清楚如何在kotlin中獲得相同的結果。

回答

1

這裏是一個純粹的科特林版本:

@Suppress("UNCHECKED_CAST") 
fun getEnumValue(enumClass: Class<*>, value: String): Enum<*> { 
    val enumConstants = enumClass.enumConstants as Array<out Enum<*>> 
    return enumConstants.first { it.name == value } 
} 

注意,它並不像Java版本那樣高效。 java.lang.Enum.valueOf使用緩存的數據結構,而這個版本需要創建一個新的數組迭代。此版本是O(n),因爲Java版本是O(1),因爲它使用引擎蓋下的字典。

Kotlin錯誤跟蹤程序中有一個open issue,以支持與預定爲1.3的Java中相同的代碼。

這裏是一個真難看黑客要解決的一般類型的問題:

private enum class Hack 

fun getEnumValue(enumClass: Class<*>, value: String): Enum<*> { 
    return helper<Hack>(enumClass, value) 
} 

private fun <T : Enum<T>>helper(enumClass: Class<*>, value: String): Enum<*> { 
    return java.lang.Enum.valueOf(enumClass as Class<T>, value) 
} 

快速測試表明,它的工作,但我不會依賴它。


如果泛型類型是可用的,你可以使用內置的功能enumValueOf(見http://kotlinlang.org/docs/reference/enum-classes.html#working-with-enum-constants):

enum class Color { 
    Red, Green, Blue 
} 

enumValueOf<Color>("Red") 
+0

我知道這個功能,但它不適用於這種情況。我已經更新了這個問題。 – Eugene

+0

非常感謝!性能在這裏不受關注 - 代碼在應用程序啓動過程中執行一次,因此該解決方案正是我所需要的。 – Eugene

1

您可以在課堂上使用下面科特林代碼Java代碼:

科特林功能代碼:

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

例子:

internal enum class MyEnum { 
    MIDDLE_NAME 
} 
internal enum class MyEnumTwo { 
    FIRST_NAME 
} 
internal enum class MyEnumThree { 
    LAST_NAME 
} 


private fun demo(){ 

    System.out.println(getEnumValue<MyEnumTwo>("FIRST_NAME")) 
    System.out.println(getEnumValue<MyEnum>("MIDDLE_NAME")) 
    System.out.println(getEnumValue<MyEnumThree>("LAST_NAME")) 

} 

輸出:

系統.out:FIRST_NAME

的System.out:MIDDLE_NAME

的System.out:LAST_NAME

老答案:

樂趣getEnumValue(enumClass:<類>,值:字符串):枚舉<> {enum.valueOf >>(enumClass as Class >>,value) }

+0

這幾乎是標準的'enumValueOf <>()'函數所做的,但那不是我所需要的。我澄清了這個問題。 – Eugene

0

科特林有一個內置功能:

enum class Fruits { 
    APPLE, 
    ORANGE, 
    BANANA 
} 

Fruits.valueOf("APPLE")