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
指派将起作用。