> Что такое smart cast в Kotlin (Kotlin, Android)

Уровень: junior · Роль: mobile · Категория: Технические вопросы

Компании: Яндекс

Стек: Kotlin, Android

> Пример ответа

Короткий ответ

Smart cast - это механизм Kotlin, который автоматически приводит тип переменной к более конкретному после проверки через is или !is. Компилятор анализирует поток выполнения и, если проверка прошла успешно, позволяет использовать переменную без явного приведения. Это работает только для val и локальных var, так как компилятор должен быть уверен, что значение не изменится между проверкой и использованием.

Подробное объяснение

Smart cast работает на основе анализа потока управления (control flow analysis). Когда вы пишете if (x is String), компилятор запоминает, что внутри ветки if переменная x имеет тип String, и разрешает вызывать строковые методы напрямую, без as String.

Основные условия для smart cast:

  • переменная - val (или локальный var, который не захватывается лямбдой и не изменяется между проверкой и использованием);
  • свойство класса - только если оно val и не имеет кастомного геттера;
  • проверка через is, !is, == null, != null, а также when с типами.

Для var внутри класса smart cast не работает, потому что компилятор не может гарантировать, что свойство не изменится из другого потока или через геттер.

На практике

В Android-разработке smart cast часто используется при работе с nullable-типами, например, при получении аргументов из Bundle или при обработке результатов findViewById после проверки на null. Также удобно применять в when для обработки sealed-классов или иерархий типов.

Важно помнить: если переменная - var и используется в лямбде, smart cast не сработает, потому что компилятор не может доказать неизменность. В таких случаях нужно явно приводить тип или копировать значение в локальную val.

Пример кода

fun process(value: Any) {
    // smart cast после is-проверки
    if (value is String) {
        println(value.length) // value автоматически String
    }

    // smart cast для nullable
    val text: String? = getText()
    if (text != null) {
        println(text.uppercase()) // text автоматически String
    }

    // smart cast в when
    when (value) {
        is Int -> println(value * 2)
        is String -> println(value.trim())
        else -> println("Unknown")
    }
}

// НЕ работает для var свойства класса
class Example {
    var data: Any? = null

    fun bad() {
        if (data != null) {
            // Ошибка: smart cast impossible, потому что data - var
            // println(data.length)
        }
    }

    fun good() {
        val local = data
        if (local != null) {
            println(local.length) // работает
        }
    }
}

Как отвечать на собеседовании

Начни с определения: smart cast - автоматическое приведение типа после проверки. Затем объясни условия: val, локальные переменные, отсутствие захвата лямбдой. Приведи пример с is и nullable. Упомяни ограничения для var свойств. Если спросят про производительность - скажи, что это compile-time фича, никакого runtime overhead нет. Хорошо показать понимание, почему для var не работает: компилятор не может гарантировать неизменность.

Что проверяет интервьюер

Интервьюер проверяет:

  • понимание базового синтаксиса и механизма работы;
  • знание ограничений smart cast (val vs var, свойства класса);
  • умение объяснить, почему компилятор не может сделать smart cast в некоторых случаях;
  • практическое применение в Android-контексте (nullable, Bundle, findViewById).

Типичные ошибки

  • утверждение, что smart cast работает для любых переменных;
  • непонимание, почему для var свойства класса не срабатывает;
  • попытка использовать smart cast после проверки в лямбде;
  • забывают, что is работает и для интерфейсов, и для sealed-классов;
  • путают smart cast с явным приведением as (которое может бросить исключение).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью