ОК, теперь, когда Котлин официально вышел из игры, и я снова начинаю играть с ним, я совершенно смущен тем, что мне нужно выбирать между преимуществами sealed
и data
, но каким-то образом не может иметь обоих.
Это, например, кажется мне полезным, но не компилируется:
sealed class Expr {
data class Const(val number: Double) : Expr()
data class Sum(val expr1 : Expr, val expr2 : Expr) : Expr()
}
потому что классы данных не могут распространять другие классы.
Есть ли что-то, что мне не хватает?
Ответ 1
Незадолго до того, как вы вошли в состояние Beta, команда Kotlin решила добавить определенные ограничения на использование классов data
(см. этот пост), потому что проблем, которые они вызвали в иерархиях классов.
Одно из ограничений заключается в том, что класс data
не должен подтипировать другой класс, допускаются только интерфейсы. Следовательно, классы data
не могут быть получены из sealed class
.
Это была необходимая мера, чтобы избежать дальнейшей отсрочки выпуска 1.0. Некоторые из ограничений, как говорили, были сняты в будущих выпусках, как только проблемные случаи будут тщательно пересмотрены, и будет найдено хорошее дизайнерское решение.