這裏是一個純粹的科特林版本:
@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")
我知道這個功能,但它不適用於這種情況。我已經更新了這個問題。 – Eugene
非常感謝!性能在這裏不受關注 - 代碼在應用程序啓動過程中執行一次,因此該解決方案正是我所需要的。 – Eugene