数据类
创建一些只保存数据的类是件寻常的事。 在这些类中,一些标准功能以及一些工具函数往往是由数据机械推导而来的。在 Kotlin 中,这叫做数据类并以data标记:
data class User(val name: String, val age: Int)
编译器自动从主构造函数中声明的所有属性导出以下成员:
equals()/hashCode()对
toString()格式是"User(name=John, age=42)"
componentN()函数按声明顺序对应于所有属性。
为了确保生成的代码的一致性以及有意义的行为,数据类必须满足以下要求:
主构造函数需要至少有一个参数。
主构造函数的所有参数需要标记为val或var。
数据类不能是抽象、开放、密封或者内部的。
此外,数据类成员的生成遵循关于成员继承的这些规则:
如果在数据类体中有显式实现equals()、hashCode()或者toString(),或者这些函数在父类中有final实现,那么不会生成这些函数,而会使用现有函数。
如果超类型具有open的componentN()函数并且返回兼容的类型, 那么会为数据类生成相应的函数,并覆盖超类的实现。如果超类型的这些函数由于签名不兼容或者是 final 而导致无法覆盖,那么会报错。
不允许为componentN()以及copy()函数提供显式实现。
创建一些只保存数据的类是件寻常的事。 在这些类中,一些标准功能以及一些工具函数往往是由数据机械推导而来的。在 Kotlin 中,这叫做数据类并以data标记:
data class User(val name: String, val age: Int)
编译器自动从主构造函数中声明的所有属性导出以下成员:
equals()/hashCode()对
toString()格式是"User(name=John, age=42)"
componentN()函数按声明顺序对应于所有属性。
为了确保生成的代码的一致性以及有意义的行为,数据类必须满足以下要求:
主构造函数需要至少有一个参数。
主构造函数的所有参数需要标记为val或var。
数据类不能是抽象、开放、密封或者内部的。
此外,数据类成员的生成遵循关于成员继承的这些规则:
如果在数据类体中有显式实现equals()、hashCode()或者toString(),或者这些函数在父类中有final实现,那么不会生成这些函数,而会使用现有函数。
如果超类型具有open的componentN()函数并且返回兼容的类型, 那么会为数据类生成相应的函数,并覆盖超类的实现。如果超类型的这些函数由于签名不兼容或者是 final 而导致无法覆盖,那么会报错。
不允许为componentN()以及copy()函数提供显式实现。