Kotlin:通过Kotlin中的Data类在Java类中设置一个私有布尔值。 为什么我无法做到这一点?

我有一个Java类的格式:

class JavaClass { private String name; private Boolean x; public String getName() { return name; } public void setName(String name) { this.name = name } public Boolean isX() { return x; } public void setX(Boolean x) { this.x = x } } 

我将这个类重写为Kotlin中的一个Data类,它的格式如下:

 data class KotlinClass( var nameNew: String? = null, var xNew: Boolean = false ): JavaClass() { init { name = nameNew x = xNew } } 

当我这样做,名字初始化这种方式不会给一个问题,但我不能以这种方式初始化x。 IDE抱怨x是不可见的。 为什么用x而不用名字?

我在Kotlin类中用一个自定义的getter和setter创建了一个名为x的新变量,它抱怨setter的意外覆盖(这是可以理解的)。 这意味着Java setter和getter在Data类中是可见的。 那么为什么setter不会被用在init块中的x上,比如它是为了名字而做的呢?

这是因为Kotlin如何将Java getter和setter表示为属性 。 如果getter签名是T isSomething() (而不是T getSomething() ),那么Kotlin属性也被命名为isSomething (不只是something )。 在你的情况下, x = xNew解析为私人字段访问。

您可以通过分配isX来修复您的代码:

 init { name = nameNew isX = xNew } 

或者,如果您在Java代码x = xNew isX()重命名为getX() ,那么x = xNew指派将起作用。