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