2016-03-10 12 views
11

OK、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

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

関連する問題