2016-03-10 2 views
11

ОК, теперь, когда Котлин официально вышел из игры, и я снова начал играть с ним, я совершенно смущен тем, что мне нужно выбирать между преимуществами sealed и data, но как-то не может быть и того, и другого.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

Незадолго до того, как вступил в бета-состояние, команда Котлина решила добавить определенные ограничения на использование классов 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

Смежные вопросы