Kotlin数据类包含开放函数
我正在读kotlin官方教程,在数据课题下 ,我提出了一个以下的观点。
如果超types具有打开并返回兼容types的componentN()函数,则将为数据类生成相应的函数并覆盖超types的函数。 如果超types的function由于不兼容的签名或者是最终的而不能被覆盖,则报告错误;
我的问题是,
1)什么是componentN()
函数?
2)数据类是否自动覆盖打开的函数?
3)以下代码是否正确?
open class SuperDataClass { open fun componentN() { println("from super class") } } data class DataClassExample (var name: String): SuperDataClass() { // }
1)什么是componentN()函数?
它们是对应于属性声明顺序的操作符函数。
例:
data class Person(name: String, age: Int)
上面的类将有一个component1
和一个component2
function,允许通过解构声明的访问命名和年龄,按顺序。
考虑到componentN
函数只是引用第1,2,3,…,第N个分量。 componentN
函数本身永远不会生成。
2)数据类是否自动覆盖打开的函数?
在数据类中,你是从Any
类扩展,你不是自动覆盖任何function。 componentN
函数是在编译时生成的。
3)以下代码是否正确?
open class SuperDataClass { open fun componentN() { println("from super class") } } data class DataClassExample (var name: String): SuperDataClass() { // }
是的,它会编译并运行正确。 但是,这只是因为,正如我之前所说的, componentN
不是为数据类生成的。
但是,在这种情况下,会为DataClassExample
的属性name
生成DataClassExample
。 正如你所发布的文档的报价说:如果你尝试这个代码,你会有一个错误。
open class SuperDataClass { open fun component1() {//<-- note this println("from super class") } } data class DataClassExample (var name: String): SuperDataClass() { // }
具体的错误是:
[DATA_CLASS_OVERRIDE_CONFLICT] Function 'component1' generated for the data class conflicts with member of supertype 'SuperDataClass'