Edited at

kotlinのreified関数はjavaからは呼べない。


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のついた関数を呼ぼうとするとエラーになるようです。