Kotlin的reified函数不能从Java调用。


修饰类型参数

kotlin具有修饰符reified。点击此处进入官方页面

可以将泛型T赋予

化,并且可以将其作为实际的类型类进行处理,因此可以使用T进行强制转换或使用if语句检查T的实例。

例如,可以定义如下。

1
2
3
4
5
6
7
8
9
// 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调用

1
2
val nums = listOf(1, 2f, 3, 4f)
val ints = nums.filterIsInstance<Int>() // [1, 3]

但是当我尝试从java调用它时,

1
2
List nums = Arrays.asList(1, 2f, 3, 4f);
List ints = ListExtKt.filterIsInstance(nums); // error: filterIsInstance has private access in ListExtKt

只能将

kotlin中的reified赋予内联函数,并且内联扩展将允许访问实际的typeclass。
从Java调用kotlin内联函数时,将直接调用内联函数,因此不会对其进行内联扩展。因此,似乎在尝试使用Java化的函数调用函数时发生错误。