例如给定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
)。