Выбор ответа Senior Null-safety обновлено
Elvis с return и тип Nothing
Вопрос
Почему компилируется val id = intent.getStringExtra("id") ?: return?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: return имеет тип Nothing, поэтому id типа String. В Kotlin return и throw это выражения типа Nothing.
Варианты ответа
returnимеет типNothing, поэтомуidтипаStringправильный ответreturnвнутри Elvis превращается вnull, иidтипаString?- Компилятор игнорирует правую часть Elvis, если она не значение
- Это работает только внутри лямбд, в обычной функции ошибка
Разбор
В Kotlin return и throw это выражения типа Nothing. Поскольку Nothing подтип всех типов, тип всего Elvis-выражения это String, а не String?, и id дальше non-null. Это идиома раннего выхода. return не превращается в null, правая часть вычисляется, если левая null, и в обычных функциях это работает так же, как в лямбдах (там нужен return@метка).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.