LoginSignup
15
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2017-07-22

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

15
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
2