Class 为什么使用Kotlin修饰符';打开';与'不兼容;数据';?

Class 为什么使用Kotlin修饰符';打开';与'不兼容;数据';?,class,inheritance,kotlin,Class,Inheritance,Kotlin,我有一门课: open data class Person(var name: String) 另一类: data class Student(var reg: String) : Person("") 这给了我一个错误: 错误:修饰符“打开”与“数据”不兼容 如果我从Person类中删除数据,就可以了 为什么kotlin打开且数据不兼容?来自: 为确保生成代码的一致性和有意义的行为,数据类必须满足以下要求: 主构造函数需要至少有一个参数 所有主构造函数参数都需要标记为val或var 数据

我有一门课:

open data class Person(var name: String)
另一类:

data class Student(var reg: String) : Person("")
这给了我一个错误:

错误:修饰符“打开”与“数据”不兼容

如果我从
Person
类中删除数据,就可以了

为什么kotlin打开且数据不兼容?

来自:

为确保生成代码的一致性和有意义的行为,数据类必须满足以下要求:

  • 主构造函数需要至少有一个参数
  • 所有主构造函数参数都需要标记为val或var
  • 数据类不能是抽象的、开放的、密封的或内部的
  • (1.1之前)数据类只能实现接口
所以主要的一点是数据类有一些生成的代码(
等于
哈希代码
复制
到字符串
组件
函数)。这样的代码不能被程序员破坏。因此,数据类有一些限制

作为州政府

  • 数据类不能是抽象的、开放的、密封的或内部的
它们不能被继承的原因是,从数据类继承会导致它们生成的方法(
等于
哈希代码
,等等)的工作方式不明确。请参阅中关于此的进一步讨论

自那以后,对数据类的限制被稍微取消了:它们现在可以从其他类继承,相关的。然而,它们仍然不能从自身继承


请注意,数据类“仅”提供了自动
equals
hashcode
toString
组件
复制
功能的额外便利。如果您不需要这些,那么像下面这样的类仍然具有带有getter/setter的属性和一个非常简单的构造函数,并且对如何将其用于继承没有任何限制:

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