我在Kotlin中有以下方法:
inline fun <reified T> foo() {
}
如果我试图像这样从Java中调用它:
myObject.foo();
或者像这样:
myObject.<SomeClass>foo();
我收到以下错误:
java:foo()在MyClass中具有私有访问权限
如何从Java调用foo
方法?
答案 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
修饰符是可行的。在其他情况下,您需要对代码进行调整以克服类型擦除。