Sealed class — это класс, у которого жестко ограничен список подклассов. Все наследники должны быть объявлены в том же файле, что и сам sealed class.
Зачем нужны?
- Типобезопасный 
when(exhaustiveness check — все ветки учтены) - Используются в MVI, UI state, Result wrappers
 - Можно передавать разные типы в одном параметре
 
Можно ли наследовать один sealed от другого?
Один sealed class может наследовать другую, но:
- всё должно быть в одном файле
 - у всех sealed-подтипов сохраняется ограниченность — это наследование тоже контролируется
 
Sealed interface — что это такое?
Добавлено в Kotlin 1.5+
Похож на sealed class, но:
sealed interfaceне может иметь состояния (нет конструктора)- может быть реализован классом или другим интерфейсом
 - также ограничивает список реализаций
 
Отличия Sealed class и Sealed interface
| Особенность | sealed class | sealed interface | 
|---|---|---|
| Можно хранить состояние | Да (есть поля, init, body) | Нет | 
| Может иметь реализацию | Да | Нет | 
Можно реализовать через class и interface | Только class | Любой тип | 
| Конструктор | Есть | Нет | 
| Множественная реализация | Нет (одна суперкласс) | Да (можно реализовать несколько интерфейсов) | 
Отличие от enum class
enum class | sealed class / sealed interface | |
|---|---|---|
| Число вариантов | Фиксировано | Тоже фиксировано (в одном файле) | 
| Хранит состояние | Да | Да (только у sealed class) | 
| Может быть абстрактной | Нет | Да | 
| Может иметь подтипы | Нет | Да |