Kotlin 中数据的继承 class

Inheritance of data class in Kotlin

我知道 Kotlin 在继承数据方面存在限制 class。我在经历这个 discussion.

时学到了更多

因为 Kotlin 中的数据 class 类似于 Java 中的 POJO。我们不应该在 Java POJO classes 中遵循继承吗?总结一下,是不是因为Kotlin的局限性,不允许我们继承数据classes,或者你这样做是设计上的缺陷。

把它分解成一个更简单的问题。从 Java 中的 POJO class 继承是错误的吗?

在 Kotlin 中,您不能从数据 class 继承,因为编译器没有合理的方法来生成自动为数据 class 提供的所有方法。

在Java中,没有compiler-generated实现equalshashCodetoString等方法,您可以自由实现以一种在您的情况下最明智的方式。因此,没有理由认为从 POJO 继承是错误的。

A data class 不等同于 POJO,它的作用不止于此,这就是它的继承受到限制的原因。

拿一个简单的POJO来说:

public class User {

    private String name;
    private int age;

    public String getName() { return name; }
    public int getAge() { return age; }

    public void setName(final String name) { this.name = name; }
    public void setAge(final int age) { this.age = age; }

    public User(final String name, final int age) {
        this.name = name;
        this.age = age;
    }

}

这在 Kotlin 中的等价物是 不是 数据 class,而是一个简单的 class 像这样:

class User(var name: String, var age: Int)

这将创建两个可变属性(字段,加上 getter 和 setter)和构造函数。这已经等同于上面的POJO。

添加 data modifier does on top of this is generate equals, hashCode, toString methods. It also adds some Kotlin-specific methods: componentN methods for destructuring declarationscopy 方法。

如果数据 classes 相互继承,这些生成的方法,特别是上面提到的前三个方法变得复杂。在有关该主题的 KEEP about this topic. See also and this 讨论中详细了解这一点。