Что такое тип Nothing в Kotlin и чем он отличается от Unit
Что проверяют
Понимаете ли вы, что это разные вещи: тип без значений и тип с одним значением. Вопрос отсеивает тех, кто считает оба «пустотой».
Как отвечать
Unit это тип с ровно одним значением, тоже называемым Unit. Функция без явного возвращаемого значения возвращает его. Это полноценный тип, поэтому его можно подставить в обобщение: Callable<Unit> корректно, тогда как void в Java так использовать нельзя.
Nothing это тип, у которого нет ни одного значения. Функция с таким возвращаемым типом не завершается нормально: она бросает исключение или зацикливается.
fun fail(message: String): Nothing = throw IllegalStateException(message)
val name: String = user.name ?: fail("имя обязательно")Практический смысл Nothing в выводе типов: он является подтипом любого типа, поэтому выражение с ним подходит в любую ветку. Именно поэтому работает ?: throw ... и почему TODO() можно поставить вместо тела функции, возвращающей что угодно.
Ещё одно применение: Nothing? это тип значения null самого по себе, а List<Nothing> это тип пустого списка, который совместим с любым List<T>.
Сводка: Unit означает «работа сделана, результата нет», Nothing означает «выполнение сюда не вернётся».
Где спотыкаются
Считают Unit аналогом void без оговорок.
Не могут объяснить, зачем нужен тип без значений.
Не знают, что Nothing подтип всех типов, и потому не понимают, почему компилятор принимает ?: throw.
Пишут Unit возвращаемым типом функции, которая всегда бросает исключение.