Выбор ответа Middle Null-safety спрашивают часто обновлено
Почему smart cast не работает для var-свойства
Вопрос
Почему этот код не компилируется?
class Screen {
var title: String? = null
fun render() {
if (title != null) {
println(title.length)
}
}
}
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: title это var-свойство: его могли изменить после проверки. Smart cast работает, только если компилятор уверен, что значение не изменилось между проверкой и использованием.
Варианты ответа
titleэтоvar-свойство: его могли изменить после проверкиправильный ответString?нельзя сравнивать сnullчерез!=, нужно!== null- Внутри
ifнужноtitle?.length: smart cast не существует - Свойство нужно пометить
lateinit, тогда проверка пройдёт
Разбор
Smart cast работает, только если компилятор уверен, что значение не изменилось между проверкой и использованием. Для var-свойства класса это не гарантировано: его может поменять другой поток или вызванный метод. Решения: скопировать в локальную val (val t = title), использовать title?.let { ... }. Сравнение с null через != разрешено, smart cast существует для локальных переменных, а lateinit не применим к nullable-типам.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.