2

我知道 Kotlin 从数据类继承存在限制。在讨论这个问题时,我没有学到更多东西。

由于 Kotlin 中的数据类类似于 Java 中的 POJO。我们不应该在 Java POJO 类中也遵循继承吗?总结一下,是因为 Kotlin 的限制不允许我们从数据类继承还是设计有缺陷。

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

4

2 回答 2

11

Adata 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 中的 this 等价物不是数据类,而只是一个像这样的简单类:

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

这将创建两个可变属性(字段,以及 getter 和 setter)和构造函数。这已经相当于上面的POJO了。

data在此之上添加修饰符的作用是 generate equals, hashCode,toString方法。它还添加了一些特定于 Kotlin 的方法:componentN用于解构声明的方法和copy方法。

这些生成的方法,特别是上面提到的前三个方法,很难定义数据类是否相互继承。请参阅KEEP中有关此主题的详细信息。另请参阅有关该主题的thisthis讨论。

于 2018-03-21T09:32:51.220 回答
5

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

在 Java 中,没有编译器生成的方法实现,例如equalshashCodetoString,您可以自由地以最适合您的情况的方式实现它们。因此,没有理由从 POJO 继承是错误的。

于 2018-03-21T09:30:37.003 回答