为什么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之前)数据类只能实现接口。

所以重点是数据类有一些生成的代码( equalshashCodecopytoStringcomponentN函数)。 这样的代码不能被程序员破坏。 因此,数据类有一些限制。

正如文件所述,

  • 数据类不能是抽象的,开放的,封闭的或内在的;

它们不能被继承的原因是从数据类继承会导致问题/模糊与他们生成的方法( equalshashcode等)应该如何工作。 在这里看到更多的讨论。

自从Kotlin 1.1以来,对数据类的限制已经被稍微取消:现在可以继承其他类,如相关提议中详细描述的那样。 但是,他们仍然不能从类继承。


请注意,“only”数据类提供了自动equalshashcodetoStringcomponentcopy函数的额外便利。 如果你不需要这些,那么像下面这样的类仍然具有getter / setter和一个非常简短形式的构造函数的属性,并且对于如何使用继承来说没有限制:

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