为什么Kotlin修饰符'open'与'data'不兼容?

Arb*_*een 7 inheritance class kotlin

我上课了

open data class Person(var name: String)
Run Code Online (Sandbox Code Playgroud)

和另一堂课

data class Student(var reg: String) : Person("")
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误

错误:修饰符'open'与'data'不兼容

如果我从Person类中删除数据的罚款.

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

Ant*_*vin 14

来自https://kotlinlang.org/docs/reference/data-classes.html:

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

  • 主构造函数需要至少有一个参数;
  • 所有主要构造函数参数都需要标记为val或var;
  • 数据类不能是抽象的,开放的,密封的或内部的;
  • (1.1之前)数据类只能实现接口.

因此,主要的一点是数据类有一些生成的代码(equals,hashCode,copy,toString,componentN函数).并且程序员不能破坏这样的代码.因此,数据类有一些限制.


zsm*_*b13 9

正如文档所述,

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

他们不能被继承的原因是,从数据类继承引起的问题/模糊性是如何产生的方法(equals,hashcode等)应该工作.请参阅此处的进一步讨论.

Kotlin 1.1以来,对数据类的限制已经略有提升:它们现在可以从其他类继承,如相关提案中详细描述的那样.但是,他们仍然不能从类本身继承.


需要注意的是数据类"只"提供了自动的额外便利equals,hashcode,toString,component,和copy功能.如果你不需要那些,那么像下面这样的类仍然具有getter/setter属性和一个非常简短形式的构造函数,并且对如何将它与继承一起使用没有限制:

class User(val name: String, var age: Int)
Run Code Online (Sandbox Code Playgroud)