Выбор ответа Senior Null-safety обновлено

Elvis с return и тип Nothing

Вопрос

Почему компилируется val id = intent.getStringExtra("id") ?: return?

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

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

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

Коротко

Правильный ответ: return имеет тип Nothing, поэтому id типа String. В Kotlin return и throw это выражения типа Nothing.

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

  1. return имеет тип Nothing, поэтому id типа Stringправильный ответ
  2. return внутри Elvis превращается в null, и id типа String?
  3. Компилятор игнорирует правую часть Elvis, если она не значение
  4. Это работает только внутри лямбд, в обычной функции ошибка

Разбор

В Kotlin return и throw это выражения типа Nothing. Поскольку Nothing подтип всех типов, тип всего Elvis-выражения это String, а не String?, и id дальше non-null. Это идиома раннего выхода. return не превращается в null, правая часть вычисляется, если левая null, и в обычных функциях это работает так же, как в лямбдах (там нужен return@метка).

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

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