Kotlin:密封 class 不能 "contain" 数据 classes?为什么?

Kotlin: sealed class cannot "contain" data classes? Why?

OK,现在 Kotlin 正式出来了,我又开始玩它了,我很困惑,我需要在 sealeddata 的优点之间做出选择,但不知何故可以两者都有。

例如,这对我来说似乎有意义,但无法编译:

sealed class Expr {
    data class Const(val number: Double) : Expr()
    data class Sum(val expr1 : Expr, val expr2 : Expr) : Expr()
}

因为数据类不能扩展其他类。

有什么我遗漏的吗?

在进入 Beta 状态前不久,Kotlin 团队决定对 data classes 的使用 (see this post) 添加某些限制,因为它们在 [=21] 中造成的问题=]层次结构。

其中一个限制是 data class 不应该子类型另一个 class,只允许接口。因此,data classes 不能派生自 sealed class.

这是避免进一步推迟 1.0 发布的必要措施。据说一旦有问题的案例被彻底审查并找到一个好的设计解决方案,一些限制将在未来的版本中取消。