Kotlin中数据类的继承

Din*_*ngh 0 inheritance pojo kotlin data-class

我知道Kotlin从数据类继承有一些限制.在进行这次讨论时,我学到了更多.

因为Kotlin中的数据类与Java中的POJO类似.我们是否应该不遵循Java POJO类中的继承?总结一下,是不是因为Kotlin的限制我们不允许从数据类继承,或者如果你这样做,设计中存在缺陷.

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

zsm*_*b13 7

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

在Kotlin中相当于它不是一个数据类,而只是一个像这样的简单类:

class User(var name: String, var age: Int)
Run Code Online (Sandbox Code Playgroud)

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

什么加入data改性剂在此之上做的是产生equals,hashCode,toString方法.它还添加了一些特定componentN于Kotlin的方法:用于解构声明copy方法和方法.

这些生成的方法,特别是上面提到的前三个方法,如果数据类相互继承,则会很复杂.请参阅KEEP中有关此主题的详细信息.又见这个这个的话题讨论.


yol*_*ole 5

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

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