【问题标题】:Java class that extends Kotlin base class cannot call internal methods of base扩展 Kotlin 基类的 Java 类不能调用基类的内部方法
【发布时间】:2018-10-18 22:59:36
【问题描述】:

我正在 Android 上使用 Kotlin 进行试验,使用 Android Studio,将它与一些现有的 Java 代码混合,我遇到了一个问题。

我在 Kotlin 中有一个基类,其中一个方法标记为 internal

package com.example.kotlin.hellokotlin

open class KotlinBaseClass
{
    internal fun doSomething()
    {
        println("Done something!")
    }
}

然后我创建一个扩展 KotlinBaseClass 的 Kotlin 类并调用基类方法:

package com.example.kotlin.hellokotlin

class KotlinDerivedClass : BaseClass()
{
    fun doSomethingElse()
    {
        doSomething()
        println("Done something else!")
    }
}

这可以编译并正常工作。

如果我现在创建一个扩展 KotlinBaseClass 的 Java 类,旨在在功能上与 KotlinDerivedClass 相同:

package com.example.kotlin.hellokotlin;

public class JavaDerivedClass extends KotlinBaseClass
{
    public void doSomethingElse()
    {
        doSomething();
        System.out.println("Done something else!");
    }
}

我发现这个类不会编译,因为方法doSomething()无法解析。如果我从KotlinBaseClassdoSomething() 的声明中删除internal 关键字,则一切正常。所有类都定义在同一个包中。

这是预期的行为吗? Java 和 Kotlin 之间的互操作性的已知问题?

【问题讨论】:

    标签: java android kotlin


    【解决方案1】:

    有名字的东西在https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html这里有解释

    内部声明在 Java 中是公开的。内部类的成员会经过名称修改,以防止在 Java 中意外使用它们,并允许重载具有相同签名但根据 Kotlin 规则看不到彼此的成员;

    在您的 Java 类中,您应该能够通过输入前几个字符然后输入 alt + space 来找到名称以获取自动完成。你的 Java 类中函数的全名是doSomething$nameOfYourModule

    或者,您可以将 doSomething 设置为 protected 并使用其正常名称访问它。

    【讨论】:

      猜你喜欢
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多