如何在Kotlin中使用不同的上限调用方法?

时间:2016-05-10 17:17:25

标签: kotlin

e.g。给定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中找到类似的方法。

1 个答案:

答案 0 :(得分:4)

至于现在,我发现了这个非常糟糕的解决方法:

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具有已知的类型参数,则它将替换为静态推断类型({{1 }})。