如何在Kotlin中调用不同的上限?
例如给定一个Class<T>
如何调用/调用需要Class<T> where T : Enum<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
)来进行一个未经检查的DummyEnum
,然后将在运行时被擦除。
限制是解决方案不能正确地使用 handleEnum
泛型 :如果handleEnum
具有指定的类型参数,它将被替换为静态推断的类型( DummyEnum
)。