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实现equals
、hashCode
和toString
等方法,您可以自由实现以一种在您的情况下最明智的方式。因此,没有理由认为从 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 declarations 和 copy
方法。
如果数据 classes 相互继承,这些生成的方法,特别是上面提到的前三个方法变得复杂。在有关该主题的 KEEP about this topic. See also and this 讨论中详细了解这一点。
我知道 Kotlin 在继承数据方面存在限制 class。我在经历这个 discussion.
时学到了更多因为 Kotlin 中的数据 class 类似于 Java 中的 POJO。我们不应该在 Java POJO classes 中遵循继承吗?总结一下,是不是因为Kotlin的局限性,不允许我们继承数据classes,或者你这样做是设计上的缺陷。
把它分解成一个更简单的问题。从 Java 中的 POJO class 继承是错误的吗?
在 Kotlin 中,您不能从数据 class 继承,因为编译器没有合理的方法来生成自动为数据 class 提供的所有方法。
在Java中,没有compiler-generated实现equals
、hashCode
和toString
等方法,您可以自由实现以一种在您的情况下最明智的方式。因此,没有理由认为从 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 declarations 和 copy
方法。
如果数据 classes 相互继承,这些生成的方法,特别是上面提到的前三个方法变得复杂。在有关该主题的 KEEP about this topic. See also