Kotlin泛型共享了Java在编译时被擦除的特性,因此,在运行时,这些列表不再提供必要的信息来执行所要求的操作。这是一个例外,如果你使用reified类型编写一个内联函数。例如,这将工作:
inline fun <reified T> handleList(l: List<T>) {
when (T::class) {
Int::class -> handleInt(l)
Double::class -> handleDouble(l)
String::class -> handleString(l)
}
}
fun main() {
handleList(mutableListOf(1,2,3))
}
内联函数获得在每个调用点扩大,虽然,乱用您的堆栈跟踪,所以应有节制地使用它们。
尽管取决于你想达到的目标,但还有一些选择。您可以在元素级别使用密封类实现类似的操作:
sealed class ElementType {
class DoubleElement(val x: Double) : ElementType()
class StringElement(val s: String) : ElementType()
class IntElement(val i: Int) : ElementType()
}
fun handleList(l: List<ElementType>) {
l.forEach {
when (it) {
is ElementType.DoubleElement -> handleDouble(it.x)
is ElementType.StringElement -> handleString(it.s)
is ElementType.IntElement -> handleInt(it.i)
}
}
}
您是针对JVM还是js?在JVM上,除了kotlin反射类型之外,还有一些反射魔法,但在js后端,所有你可以依赖的都是重写类型。 – glee8e