【问题标题】:How can I call Kotlin methods with reified generics from Java?如何使用 Java 中的具体泛型调用 Kotlin 方法?
【发布时间】:2017-08-02 04:18:06
【问题描述】:

我在 Kotlin 中有以下方法:

inline fun <reified T> foo() {

}

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

myObject.foo();

或者像这样:

myObject.<SomeClass>foo();

我收到以下错误:

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

如何从 Java 中调用 foo 方法?

【问题讨论】:

    标签: java kotlin reification


    【解决方案1】:

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

    【讨论】:

    • 非常感谢~ brb 把java代码一点一点的重构给kotlin
    • 为了使转换更容易,您可以定义一个重载,它使用 Class 而不是实现中的具体类型作为重载。 kotlin inline fun &lt;reified T&gt; help() = help(T::class.java); fun &lt;T&gt; help(cls: Class&lt;T&gt;) { ... } 这样你就可以通过 Kotlin 中的具体泛型和 Java 中的类对象来调用它`
    【解决方案2】:

    在没有reified 类型参数的情况下声明的inline 函数可以作为常规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 修饰符会起作用。在其他情况下,您需要对代码进行调整以克服类型擦除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 2011-05-18
      相关资源
      最近更新 更多