当前位置: 首页 > 知识库问答 >
问题:

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

太叔睿
2023-03-14

我有一个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 class KotlinClass(
    var nameNew: String? = null,
    var xNew: Boolean = false
): JavaClass() {

    init {
        name = nameNew
        x = xNew
    }
}

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

我在静态编程语言类中创建了一个名为x的新变量,带有一个自定义的getter和setter,它抱怨setter意外覆盖(这是可以理解的。)。这意味着setter和getterJava在Data类中是可见的。那么为什么setter没有像用于name一样用于init块中的x呢?

共有1个答案

周鸿运
2023-03-14

这是因为Kotlin如何将Java getter和setter表示为属性。如果getter签名是isSomething(而不是getSomething),那么Kotlin属性也被命名为isSomething(而不仅仅是某个)。在您的情况下,新的解析为私有字段访问。

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

init {
    name = nameNew
    isX = xNew
}

或者,如果您在Java代码中将isX()重命名为getX(),那么您的新分配将起作用。

 类似资料:
  • 我有我的科特林班 以下是我获得价值的方式 但问题是,我没有任何问题地获得了字段的价值。但是 布尔字段始终保持 null。我已经用一些其他布尔前缀,这很好。当我使用 或 时,我没有得到布尔值。任何人都可以解释我为什么我面临这个问题。#AskFirebase

  • 我是kotlin的新手,当我阅读kotlin中的数据类时,我发现了这些代码。这基本上是java模型类和kotlin数据类之间的比较,而且这两个代码都执行相同的任务。 代码1 代码2 我的问题是,在数据类中,所有变量都是公共的而不是私有的,任何人都可以在此类对象的帮助下直接访问变量,但在java代码中,所有变量都是私有的,这就是为什么我们必须为这些成员变量编写getter和setter,如果它是公共

  • 问题内容: 我以为Python信任程序员。 问题答案: 圭多对此的看法: 我昨晚想到了这一点,意识到根本不应该允许您继承bool!子类仅在具有实例时才有用,但是仅存在bool子类的实例将打破不变的事实,即True和False是bool的唯一实例!(C的子类的实例也是C的实例。)我认为重要的是不要提供后门来创建其他bool实例,因此我认为bool不应是子类的。 参考: http //mail.pyt

  • 我正在开发一个使用反射的库,我想操纵给定KClass的所有属性/函数。 使用属性,我可以操作所有可访问的成员(根据留档),即:公共、内部和受保护的字段、属性和函数。但是我看不到私有的。 使用Java反射,我可以使用,同样,我可以看到使用类的私有方法。getDeclaredMethods()。 有没有办法使用kotlin反射API来实现这一点?

  • 在Kotlin中,您可以创建: 然后可以使用它解析JSON,例如“{n:10}”。在这种情况下,您将有一个对象,从、或接收,它包含以下值:。 在Kotlin+GSON-How to get a emptyList when null for data类中,您可以看到另一个示例。 当您以后尝试使用时,您将在这里得到一个异常::“Kotlin.TypeCastException:null不能被强制转换