问题 Kotlin:密封类不能“包含”数据类?为什么?


好吧,既然Kotlin正式退出,我又开始玩它了,我很困惑,我需要在两者的优势之间做出选择。 sealed 和 data 但不知何故不能兼得。

例如,这似乎对我有意义,但不编译:

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

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

有什么我想念的吗?


3417
2018-03-10 15:52


起源

从Kotlin 1.1开始,现在可以实现 kotlinlang.org/docs/reference/...。 - Stim


答案:


在进入Beta状态之前不久,Kotlin团队决定增加一些限制 data 课程用法(看这篇文章)因为它们在类层次结构中引起的问题。

其中一个限制是 data class不应该为另一个类子类型,只允许接口。所以, data 类不能从a派生 sealed class

这是避免进一步推迟1.0版本的必要措施。一旦有问题的案例得到彻底审查并找到了良好的设计解决方案,据说在未来的版本中会解除一些限制。


15
2018-03-10 16:14



谢谢你的链接! - Lovis
所以,也许有希望 - 感谢您的解释! - david.mihola
如果我正确阅读,看起来这个限制将被解除1.1(见 这个问题 和 这个设计文件)。 - mkobit
@mkobit,正确,这是计划的,1.1。但是,仍然可以更改为1.1版本处理的任何功能,不会为预览版本提供兼容性保证。 - hotkey