为什么Kotlin修饰符“打开”与“数据”不兼容?
我有一堂课
open data class Person(var name: String)
和另一类
data class Student(var reg: String) : Person("")
这给了我一个错误
错误:修饰符“打开”与“数据”不兼容
如果我从Person类删除数据的罚款。
为什么kotlin打开和数据不兼容?
从https://kotlinlang.org/docs/reference/data-classes.html :
为确保生成的代码的一致性和有意义的行为,数据类必须满足以下要求:
- 主构造函数需要至少有一个参数;
- 所有主构造函数参数都需要标记为val或var;
- 数据类不能是抽象的, 开放的 ,封闭的或内部的;
- (1.1之前)数据类只能实现接口。
所以重点是数据类有一些生成的代码( equals
, hashCode
, copy
, toString
, componentN
函数)。 这样的代码不能被程序员破坏。 因此,数据类有一些限制。
正如文件所述,
- 数据类不能是抽象的,开放的,封闭的或内在的;
它们不能被继承的原因是从数据类继承会导致问题/模糊与他们生成的方法( equals
, hashcode
等)应该如何工作。 在这里看到更多的讨论。
自从Kotlin 1.1以来,对数据类的限制已经被稍微取消:现在可以继承其他类,如相关提议中详细描述的那样。 但是,他们仍然不能从类继承。
请注意,“only”数据类提供了自动equals
, hashcode
, toString
, component
和copy
函数的额外便利。 如果你不需要这些,那么像下面这样的类仍然具有getter / setter和一个非常简短形式的构造函数的属性,并且对于如何使用继承来说没有限制:
class User(val name: String, var age: Int)