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() { // } 

One Solution collect form web for “Kotlin数据类包含开放函数”

1)什么是componentN()函数?

它们是对应于属性声明顺序的操作符函数。

例:

  data class Person(name: String, age: Int) 

上面的类将有一个component1和一个component2function,允许通过解构声明的访问命名和年龄,按顺序。
考虑到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' 
  • Android库不能编译kotlin
  • 创建Kotlin对象的新实例
  • 无法将Kotlin Android扩展程序添加到我的项目中
  • 我想将我的kotlin版本添加到gradel项目中
  • 如何将活动中的值传递给kotlin中的另一个活动
  • Kotlin Android扩展和菜单
  • 如何在Android片段中正确实现一个接口?
  • 如何将+/-function添加到kotlin android中的对接
  • 接口中的属性不能有后台字段
  • Kotlin扩展任何?.toString()
  • Android NavigationView Headerlayout的视图元素不会触发点击事件
  • Kotlin language will be the best programming language for Android.