如何从 Java 中调用带有重新定义的泛型的 Kotlin 方法?

2022-09-01 17:25:35

我在 Kotlin 中有以下方法:

inline fun <reified T> foo() {

}

如果我尝试从Java调用它,如下所示:

myObject.foo();

或者像这样:

myObject.<SomeClass>foo();

我收到以下错误:

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

如何从Java调用该方法?foo


答案 1

没有办法从 Java 使用重新定义的类型参数调用 Kotlin 函数,因为它们必须在调用站点进行转换和内联(在你的情况下,应该在每个调用站点上用实际类型替换,但函数的编译器逻辑要多得多),而 Java 编译器预计完全没有意识到这一点。inlineTinline


答案 2

声明的没有类型参数的函数可以作为常规 Java 函数从 Java 调用。但是使用类型参数声明的那些不能从Java调用。inlinereifiedreified

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

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


推荐