我在Java中有一个子类,在Kotlin中有一个父类,在Java中有SuperParent类,我在访问Kotlin类的字段时遇到问题,它显示错误错误:(11,28)java:count has父级中的私人访问权限:以下代码:
public class Child extends Parent {
public static void main(String[] args) {
Child child = new Child();
child.getParentCount();
}
private void getParentCount() {
**//here error comes (Error:(11, 28) java: count has private access in Parent)**
System.out.println(***count***);
}
}
open class Parent : SuperParent() {
protected var count: Int =0
init {
// but this works properly , if I remove the error in child class
println(superCount)
}
}
public class SuperParent {
protected int superCount = 5;
public SuperParent() {
// this also prints properly on removing error
System.out.println(superCount);
}
}
答案 0 :(得分:3)
简短的回答:从Java中,您应该可以使用getCount()
(和setCount()
)代替count
。
长答案:
这是Kotlin处理属性的结果。
在Java中,字段(成员变量)可以具有任何范围。但是实际上,将它们公开是一种阻止您控制对其进行访问或修改方式的方法,因此通常的模式是保持它们为私有并具有访问器方法(get()
,如果可写,则为set()
)。
由于这种模式非常普遍且冗长,因此Kotlin会为您照顾它。 Kotlin属性外观类似于字段,但是(在Kotlin / JVM中)它们是通过私有字段以及具有相关范围的自动生成的访问器方法实现的。使用该字段时,Kotlin会自动调用相关的访问器。
如果您正在编写纯Kotlin,那么所有内容都是隐藏的,无需担心。但是这个问题说明了当您将Java和Kotlin混合使用时,它将如何引起意外!
幸运的是,解决方法通常很简单。在这种情况下,Parent
定义属性protected var count: Int = 0
。生成的字节码将具有一个称为count
的 private 字段,并具有受保护的getCount()
和setCount()
方法。因此,您可以通过调用这些方法来获得所需的效果。 (当然,这是您通常在Java中通常要做的事情。)
在一些极端的情况下,它并不是那么简单(例如,如果您要扩展一个已经定义了与访问器冲突的方法的类),但这很少见。