コトルのジェネリックスは、コンパイル時に消去されるというJavaの特徴を共有しているため、実行時に、これらのリストは、あなたが求めていることを行うために必要な情報を保持しません。例外は、修飾された型を使用してインライン関数を記述する場合です。例えば、これは動作します:
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 refied型のほかにいくつかのリフレクションマジックがありますが、jsバックエンドでは依存することができるのはすべてrefied型です。 – glee8e