例如给定Class<T>,我如何调用/调用需要Class<T> where T : Enum<T>的方法/构造函数?

fun <T : Any> handleAny(classOfT: Class<T>) {
    if (classOfT.isEnum) {
        handleEnum(classOfT)
    }
}

fun <T : Enum<T>> handleEnum(classOfT: Class<T>) { /*...*/ }

错误:inferred type T is not a subtype of kotlin.Enum<T>
在Java中,我可以进行未经检查的调用,但似乎找不到在Kotlin中进行类似操作的方法。

最佳答案

到目前为止,我发现了一个非常棘手的解决方法:

private enum class DummyEnum

fun <T> handleAny(classOfT: Class<T>) {
    if (classOfT.isEnum) {
        handleEnum(classOfT as Class<DummyEnum>) //absolutely any enum goes
    }
}

fun <T : Enum<T>> handleEnum(classOfT: Class<T>) {
    println(classOfT.toString())
}

这个想法是使用任何满足上限的通用参数(使其为DummyEnum)对类型进行未经检查的强制转换,然后无论如何在运行时将其擦除。

局限性在于解决方案不能与已定义的泛型一起正常使用:如果handleEnum具有已定义的类型参数,则它将替换为静态推断的类型(DummyEnum)。

10-06 00:14