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

时间:2017-08-08 17:06:04

标签: java kotlin kotlin-android-extensions

我有一个格式为的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类中创建了一个新变量,其名称为x,带有自定义getter和setter,并且它抱怨了setter的意外覆盖(这是可以理解的)。这意味着Java setter和getter在Data类中可见。那么为什么setter不在init块中用于x,就像它为名称做的那样?

1 个答案:

答案 0 :(得分:6)

这是因为how Kotlin represents Java getters and setters as properties。如果getter签名是T isSomething()(而不是T getSomething()),那么Kotlin属性也被命名为isSomething(而不仅仅是something)。在您的情况下,x = xNew解析为私人字段访问。

您可以通过指定isX来修改代码:

init {
    name = nameNew
    isX = xNew
}

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