在Kotlin中有没有一种方法可以将变量转换为Enum和接口的交集?

9rnv2umw  于 2023-05-07  发布在  Kotlin
关注(0)|答案(1)|浏览(172)

我有以下函数,它定义了一个泛型参数,该参数是枚举和接口的交集。GameConfigEnum接口基本上强制Enum具有displayName成员。
fun <E> valFromDisplayName(enum: E, displayName: String) : E where E: Enum<*>, E: GameConfigEnum{ return enum.javaClass.enumConstants.first { it.displayName == displayName } }
但是,我找不到一种方法将变量强制转换为所需的enum参数,该参数同时满足Enum<*>GameConfigEnum。获取调用代码的片段:
if(prop.value is Enum<*> && prop.value is GameConfigEnum) { val x = valFromDisplayName(prop.value as ??, value as String) }
我需要一个显式的强制转换,如果我强制转换为GameConfigEnum,它需要一个Enum<*>,如果我强制转换为Enum<*>,它需要一个GameConfigEnumprop.value满足调用代码中的if语句。
我试图阅读Kotlin中的类交叉支持,但没有找到一种方法来转换到交叉类。

ubof19bj

ubof19bj1#

在Kotlin1.6.21中,你似乎不需要演员阵容:

enum class GreatGameConfigEnum(override val displayName: String): GameConfigEnum {
    JOYSTICK("joystick"),
    EXAMPLE("example");
}

fun findVal(arg: Any, displayName: String): Any? {
    return if (arg is Enum<*> && arg is GameConfigEnum)
        valFromDisplayName(arg, displayName)
    else null
}

@Test
fun test() {
    val e = findVal(GreatGameConfigEnum.EXAMPLE, "joystick")
    assertEquals(GreatGameConfigEnum.JOYSTICK, e)
}

相关问题