扩展Kotlin基类的Java类无法调用base的内部方法

时间:2018-10-18 22:59:36

标签: java android kotlin

我正在Android和Android Studio上试用Kotlin,并将其与一些现有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()。如果我从internal的{​​{1}}的声明中删除了doSomething()关键字,那么一切正常。所有类都在同一包中定义。

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

1 个答案:

答案 0 :(得分:2)

https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html

中解释了带有名称的内容
  

内部声明在Java中公开。内部类的成员会经历名称重整,以使其更难从Java中意外使用它们,并允许重载具有相同签名且根据Kotlin规则彼此不可见的成员;

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

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