How would you rewrite the following Java code in Kotlin?

@SuppressWarnings({ "unchecked", "rawtypes" })
static Object getEnumValue(String enumClassName, String enumValue) throws ClassNotFoundException {
    Class<Enum> enumClz = (Class<Enum>)Class.forName(enumClassName);
    return Enum.valueOf(enumClz, enumValue);
}

有问题的一行是Enum.valueOf(enumClz, enumValue)

IntelliJ IDE/Android Studio的自动转换会产生以下Enum.valueOf<Enum>(enumClz, enumValue)个结果,但是Kotlin中没有这样的方法Enum.valueOf.

Forcing Kotling to use java.lang.Enum: java.lang.Enum.valueOf<Enum>(enumClz, enumValue). Compile error on the generic binding One type argument expected for class Enum<E: Enum<E>>.

将类型参数添加为java.lang.Enum.valueOf<Enum<*>>(enumClz, enumValue)会产生另一个错误:Type argument is not within its bounds. Expected: Enum<Enum<*>!>! Found: Enum<*>.

推荐答案

您可以通过以下方式完成此操作,当然,您可能应该对传递的参数执行一些额外的判断,但这应该是您要查找的内容:

fun getEnumValue(enumClassName: String, enumValue: String): Any {
    val enumClz = Class.forName(enumClassName).enumConstants as Array<Enum<*>>
    return enumClz.first { it.name == enumValue }
}

还有enumValueOf函数,但你需要知道实际的枚举类型,所以不确定它是否有用,总之,这里是你可以使用的方法:

enum class SomeEnum{
    FIRST, SECOND
}
val enumMember = enumValueOf<SomeEnum>("FIRST")

Kotlin相关问答推荐

最好的方法来创建一个 map 在kotlin从两个列表

如何在使用Kotlin Coroutines时检测和记录何时出现背压

如何为集成测试配置Gradle JVM测试套件?

Kotlin中函数引用的否定

KTOR';S函数`staticResources`在Kotlin本机目标上不可用

在 Kotlin 中定义基于多态函数的泛型函数

Kotlin中用于调用常量名称的枚举类方法之间的区别

Jetpack Compose 中的连续重组

如何将 `throw` 放置在辅助函数中但仍然具有空安全性?

如何判断给定字符串是否多次包含另一个子字符串?

如何从kotlin中的ArrayList中删除所有元素

如何使用 Android CameraX 自动对焦

Android 导航组件 - 向上导航打开相同的片段

Kotlin默认使用哪种排序?

Kotlin suspend fun

如何在 Jetpack Compose 的 LazyColumn/LazyRow 中禁用和启用滚动?

Android Jetpack导航,另一个主机片段中的主机片段

Android Jetpack Compose 中的文本渐变

从 java 活动 *.java 启动 kotlin 活动 *.kt?

如何在 Kotlin 中定义新的运算符?