我有一个 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 而不是 name?
我在 Kotlin 类中创建了一个名为 x 的新变量,带有自定义的 getter 和 setter,它提示 setter 的意外覆盖(这是可以理解的。)。这意味着Java setter 和getter 在Data 类中是可见的。那么为什么 setter 不被用于 init block 中的 x ,就像它为 name 做的那样?
最佳答案
这是因为 how Kotlin represents Java getters and setters as properties .如果 getter 签名是 T isSomething()
(而不是 T getSomething()
),那么 Kotlin 属性也被命名为 isSomething
(不是只是 something
) 。在您的情况下, x = xNew
解析为私有(private)字段访问。
您可以通过分配 isX
来修复您的代码:
init {
name = nameNew
isX = xNew
}
或者,如果您在 Java 代码中将 isX()
重命名为 getX()
,那么您的 x = xNew
分配将起作用。
关于java - Kotlin:通过 Kotlin 中的 Data 类在 Java 类中设置私有(private) boolean 值。为什么我不能这样做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45574203/