我正在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之间的互操作性的已知问题?
答案 0 :(得分:2)
https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html
中解释了带有名称的内容内部声明在Java中公开。内部类的成员会经历名称重整,以使其更难从Java中意外使用它们,并允许重载具有相同签名且根据Kotlin规则彼此不可见的成员;
在Java类中,您应该可以通过以下方式找到名称:键入前几个字符,然后输入alt + space
以获取自动完成功能。您的Java类中的函数的全名是doSomething$nameOfYourModule
或者,您可以将doSomething
设置为protected
,并使用其常规名称进行访问。