【问题标题】:Why Kotlin modifier 'open' is incompatible with 'data'?为什么 Kotlin 修饰符 'open' 与 'data' 不兼容?
【发布时间】:2017-05-30 15:44:12
【问题描述】:

我有一堂课:

open data class Person(var name: String)

和另一个班级:

data class Student(var reg: String) : Person("")

这给了我一个错误:

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

如果我从 Person 类中删除数据,那很好。

为什么kotlin open 和数据不兼容?

【问题讨论】:

    标签: class inheritance kotlin


    【解决方案1】:

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

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

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

    所以重点是数据类有一些生成的代码(equalshashCodecopytoStringcomponentN 函数)。并且这样的代码不能被程序员破坏。因此,数据类有一些限制。

    【讨论】:

      【解决方案2】:

      正如documentation 所说,

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

      它们不能被继承的原因是,从数据类继承会导致它们生成的方法(equalshashcode 等)的工作方式不明确。在answer to another question 中查看有关此问题的进一步讨论。

      Kotlin 1.1 起,对数据类的限制略有解除:它们现在可以从其他类继承,如相关proposal 中详细描述的那样。但是,它们仍然不能从自身继承。


      请注意,数据类“仅”提供了自动 equalshashcodetoStringcomponentcopy 函数的额外便利。如果您不需要这些,那么像下面这样的类仍然具有带有 getter/setter 的属性和一个非常简短的构造函数,并且对于如何将其与继承一起使用没有限制:

      class User(val name: String, var age: Int)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-21
        • 2017-10-08
        • 2014-11-06
        • 2023-03-29
        • 2011-04-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多