Выбор ответа Middle Null-safety спрашивают часто обновлено

Почему smart cast не работает для var-свойства

Вопрос

Почему этот код не компилируется?

class Screen {
    var title: String? = null
    fun render() {
        if (title != null) {
            println(title.length)
        }
    }
}

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: title это var-свойство: его могли изменить после проверки. Smart cast работает, только если компилятор уверен, что значение не изменилось между проверкой и использованием.

Варианты ответа

  1. title это var-свойство: его могли изменить после проверкиправильный ответ
  2. String? нельзя сравнивать с null через !=, нужно !== null
  3. Внутри if нужно title?.length: smart cast не существует
  4. Свойство нужно пометить lateinit, тогда проверка пройдёт

Разбор

Smart cast работает, только если компилятор уверен, что значение не изменилось между проверкой и использованием. Для var-свойства класса это не гарантировано: его может поменять другой поток или вызванный метод. Решения: скопировать в локальную val (val t = title), использовать title?.let { ... }. Сравнение с null через != разрешено, smart cast существует для локальных переменных, а lateinit не применим к nullable-типам.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.