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

How can I call Kotlin methods with reified generics from Java?

我在 Kotlin 中有以下方法:

inline fun <reified T> foo() {

}

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

myObject.foo();

或者像这样:

myObject.<SomeClass>foo();

我收到以下错误:

java: foo() has private access in MyClass

如何从 Java 调用 foo 方法?

无法从 Java 调用具有具体化类型参数的 Kotlin inline 函数,因为它们必须在调用站点进行转换和内联(在您的情况下,T 应该是在每个调用点替换为实际类型,但是 inline 函数的编译器逻辑远不止这个),并且 Java 编译器完全没有意识到这一点。

声明的 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 修饰符是可行的。在其他情况下,您需要对代码进行调整以克服类型擦除。