> Что такое 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(которое может бросить исключение).
> Похожие задачи по mobile
Как работают final и static в Kotlin и Java
Как остановить корутину и гарантированно отменить ее в Kotlin
Может ли suspend функция работать вне CoroutineScope
Почему происходит ошибка при обращении к неинициализированной переменной в Kotlin и где это происходит
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью