2016-03-10 73 views
11

好的,现在Kotlin已经正式出来了,我又开始玩了,我很困惑,我需要在sealeddata之间进行选择,但不知何故都不能兼得。Kotlin:密封类不能“包含”数据类?为什么?

这一点,例如,似乎是有道理的我,但不编译:

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

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

有什么我失踪?

+0

由于Kotlin 1.1现在可以使用https://kotlinlang.org/docs/reference/whatsnew11.html?q=da&p=0#sealed-and-data-classes。 – Stim

回答

15

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

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

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

+1

感谢您的链接! – Lovis

+0

所以,也许有希望 - 感谢解释! –

+1

如果我阅读正确,看起来这个限制将会被解除1.1(参见[本期])(https://github.com/Kotlin/KEEP/issues/31)和[本设计文档](https:/ /github.com/Kotlin/KEEP/blob/master/proposals/data-class-inheritance.md))。 – mkobit

相关问题