Kotlin:通过 Kotlin 中的数据 class 在 Java class 中设置私有布尔值。为什么我不能这样做?

Kotlin: Setting a private Boolean in Java class via a Data class in Kotlin. Why am I not able to do this?

我有一个 Java class 的格式:

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 }
}

我正在将此 class 覆盖为 Kotlin 中的数据 class,其格式为:

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

    init {
        name = nameNew
        x = xNew
    }
}

当我这样做的时候,用这种方式初始化名称没有问题,但是我不能用这种方式初始化x。 IDE 抱怨 x 是不可见的。 为什么用 x 而不是 name?

我在 Kotlin class 中创建了一个名为 x 的新变量,带有自定义 getter 和 setter,它抱怨 setter 的意外覆盖(这是可以理解的。)。这意味着 Java setter 和 getter 在数据 class 中可见。那么为什么 setter 没有像在 name 中那样在 init 块中用于 x?

这是因为 。如果 getter 签名是 T isSomething()(而不是 T getSomething()),那么 Kotlin 属性 也被命名为 isSomething(不仅仅是 something) .在您的情况下,x = xNew 解析为私有字段访问权限。

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

init {
    name = nameNew
    isX = xNew
}

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