我正在阅读kotlin官方教程,在data class topic下,我提出了以下观点。
如果超类型具有打开的componentN()函数并返回兼容类型,则会为数据类生成相应的函数并覆盖超类型的函数。如果由于签名不兼容或最终导致超类型的功能无法被覆盖,则会报告错误;
我的问题是,
1)什么是componentN()
函数?
2)数据类是否自动覆盖open函数?
3)以下代码是否正确?
open class SuperDataClass {
open fun componentN() {
println("from super class")
}
}
data class DataClassExample (var name: String): SuperDataClass() {
//
}
答案 0 :(得分:0)
1)什么是componentN()函数?
它们是与声明顺序对应的属性的运算符函数。
示例:
data class Person(name: String, age: Int)
上述课程将设有component1
和component2
功能,允许access through destructuring declaration按此顺序命名和年龄。
考虑到componentN
函数仅用于引用第1,第2,第3,......,第N个组件。永远不会生成componentN
函数本身。
2)数据类是否自动覆盖open函数?
在数据类中,您从Any
类扩展,您不会自动覆盖任何函数。 componentN
函数在编译时生成。
3)以下代码是否正确?
open class SuperDataClass {
open fun componentN() {
println("from super class")
}
}
data class DataClassExample (var name: String): SuperDataClass() {
//
}
是的,它将编译并将正确运行。但这只是因为,正如我之前所说,componentN
并未为数据类生成
但是,在这种情况下,会为component1
的属性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'