Reified type parameters
kotlinにはreified
という修飾詞があります。公式ページはこちら
reifiedはgenericsT
に対して付与することができ、実際の型クラスとして扱得るようになるため、T
でcastしたり、if文でT
のインスタンスチェックなどをすることができます。
例えば以下のように定義することができます。
// ListExt.kt
inline fun <reified T> List<T>.filterInstance(): List<T> {
val destination = mutableListOf<T>()
this.forEach {
if (it is T) destination.add(it)
}
return destination
}
これをkotlinから呼ぶと
val nums = listOf(1, 2f, 3, 4f)
val ints = nums.filterIsInstance<Int>() // [1, 3]
しかし、これをjavaから呼ぼうとすると、
List nums = Arrays.asList(1, 2f, 3, 4f);
List ints = ListExtKt.filterIsInstance(nums); // error: filterIsInstance has private access in ListExtKt
kotlinにおけるreified
はinline関数に対してのみ付与することができ、inline展開されることによって実際の型クラスにアクセスできるようになります。
javaからkotlinのinline関数を呼んだ際には、inline関数を直接呼ぶため、inline展開されませません。その為、javaからreifiedのついた関数を呼ぼうとするとエラーになるようです。