我知道 Kotlin 从数据类继承存在限制。在讨论这个问题时,我没有学到更多东西。
由于 Kotlin 中的数据类类似于 Java 中的 POJO。我们不应该在 Java POJO 类中也遵循继承吗?总结一下,是因为 Kotlin 的限制不允许我们从数据类继承还是设计有缺陷。
把它分解成一个更简单的问题。从 Java 中的 POJO 类继承是错误的吗?
我知道 Kotlin 从数据类继承存在限制。在讨论这个问题时,我没有学到更多东西。
由于 Kotlin 中的数据类类似于 Java 中的 POJO。我们不应该在 Java POJO 类中也遵循继承吗?总结一下,是因为 Kotlin 的限制不允许我们从数据类继承还是设计有缺陷。
把它分解成一个更简单的问题。从 Java 中的 POJO 类继承是错误的吗?
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中有关此主题的详细信息。另请参阅有关该主题的this和this讨论。
在 Kotlin 中,您不能从数据类继承,因为编译器没有明智的方法来生成为数据类自动提供的所有方法。
在 Java 中,没有编译器生成的方法实现,例如equals
、hashCode
和toString
,您可以自由地以最适合您的情况的方式实现它们。因此,没有理由从 POJO 继承是错误的。