如何使用Java中的具体化泛型来调用Kotlin方法?

时间:2017-03-11 23:10:24

标签: java kotlin reification

我在Kotlin中有以下方法:

inline fun <reified T> foo() {

}

如果我试图像这样从Java中调用它:

myObject.foo();

或者像这样:

myObject.<SomeClass>foo();

我收到以下错误:

  

java:foo()在MyClass中具有私有访问权限

如何从Java调用foo方法?

2 个答案:

答案 0 :(得分:21)

没有办法使用来自Java的具体类型参数来调用Kotlin inline函数,因为它们必须在调用站点进行转换和内联(在您的情况下,T应该替换为实际类型at每个调用站点,但inline函数的编译器逻辑比这更多,并且Java编译器预计完全没有意识到这一点。

答案 1 :(得分:0)

未声明 inline 类型参数的 reified 函数可以作为常规 Java 函数从 Java 中调用。但是用 reified 类型参数声明的那些不能从 Java 调用。

即使您使用反射调用它,如下所示:

Method method = MyClass.class.getDeclaredMethod("foo", Object.class);
method.invoke(new MyClass(), Object.class);

你得到了 UnsupportedOperationException: This function has a reified type parameter and thus can only be inlined at compilation time, not called directly.

如果您有权访问该函数的代码,则在某些情况下删除 reified 修饰符是可行的。在其他情况下,您需要对代码进行调整以克服类型擦除。