Ответ
When с вложенными sealed классами в Kotlin работает через последовательное сопоставление типов. Компилятор проверяет все возможные варианты, включая вложенные sealed-классы.
Пример:
sealed class Parent {
sealed class Child1 : Parent() {
object A : Child1()
object B : Child1()
}
sealed class Child2 : Parent() {
object C : Child2()
object D : Child2()
}
}
fun handle(parent: Parent) = when(parent) {
is Parent.Child1 -> when(parent) {
Parent.Child1.A -> "Child1 A"
Parent.Child1.B -> "Child1 B"
}
is Parent.Child2 -> when(parent) {
Parent.Child2.C -> "Child2 C"
Parent.Child2.D -> "Child2 D"
}
}
Ключевые моменты:
- Внешний when проверяет тип Parent
- Внутренние when проверяют конкретные реализации Child1/Child2
- Компилятор требует обработки всех возможных вариантов
- Можно использовать как вложенные when, так и плоскую структуру с is-проверками