Как будет работать when при множественной вложенности в sealed class

«Как будет работать when при множественной вложенности в sealed class» — вопрос из категории Kotlin, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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"
    }
}

Ключевые моменты:

  1. Внешний when проверяет тип Parent
  2. Внутренние when проверяют конкретные реализации Child1/Child2
  3. Компилятор требует обработки всех возможных вариантов
  4. Можно использовать как вложенные when, так и плоскую структуру с is-проверками