Kotlin: закрытый класс не может "содержать" классы данных? Зачем?

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