java - Kotlin:通过 Kotlin 中的 Data 类在 Java 类中设置私有(private) boolean 值。为什么我不能这样做?

标签 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 而不是 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/

相关文章:

java - Kotlin:集合的多种操作

android - 将 Kotlin @Parcelize 与多态一起使用

java - 多参数输入字符串

java - Spring - 缺少必需的库 - hibernate3-3.2.3.GA.jar

java - Java String 类内部是如何工作的?

authentication - 来自 UserHashedTableAuth 的 Ktor 基本认证

spring - Jackson ObjectWriter 只从流中写入第一个条目

kotlin - 使用 Maven 编译 gRPC,使用 Kotlin 和 Java(各种包未找到)

java - Android Espresso 测试中的 stub /模拟意图

android - 在扩展函数中检索返回值的类