> Что такое тип Nothing в Kotlin и чем он отличается от Unit (Kotlin, Android)
Уровень: junior · Роль: mobile · Категория: Технические вопросы
Компании: MTS, Dogma, TrendTech, Астра
Стек: Kotlin, Android
> Пример ответа
Короткий ответ
Nothing - это тип, который не имеет ни одного значения. Он используется для обозначения кода, который никогда не завершится нормально: выброс исключения, бесконечный цикл или TODO(). Unit - это тип с единственным значением, аналог void в Java, означающий, что функция ничего не возвращает. Главное отличие: Nothing - это subtype всех типов, а Unit - обычный тип в иерархии.
Подробное объяснение
Nothing в Kotlin - это специальный тип, который находится в самом низу иерархии типов. Он является subtype любого другого типа, включая пользовательские классы, Int, String и так далее. Это возможно потому, что значений типа Nothing не существует - никто не может создать переменную этого типа. Поэтому компилятор позволяет использовать Nothing в любом месте, где ожидается любой другой тип.
Основные сценарии использования Nothing:
- Функции, которые всегда выбрасывают исключение (
throw). - Функции, которые никогда не возвращают управление (бесконечный цикл).
- Выражение
TODO()из стандартной библиотеки - оно имеет типNothing.
Unit - это обычный тип с одним значением - самим Unit. Функции, объявленные с возвращаемым типом Unit, фактически ничего не возвращают (или возвращают Unit неявно). В Java аналог - void, но в Kotlin Unit - полноценный тип, который можно использовать в generics, как возвращаемое значение и так далее.
Ключевое отличие в поведении: если функция возвращает Unit, она завершается нормально, просто без полезного результата. Если функция возвращает Nothing, она никогда не завершится нормально - либо бросит исключение, либо зациклится.
На практике
В Android-разработке Nothing часто встречается в функциях-заглушках или при обработке ошибок. Например, при написании TODO() в теле функции, которая ещё не реализована. Также Nothing используется в библиотеках для типизации функций, которые всегда бросают исключение, например, в require() или check().
Unit используется повсеместно: любой метод, который выполняет действия без возврата результата (например, onClick, setText, finish()), возвращает Unit. В Android это стандарт для колбэков и обработчиков событий.
Пример кода
// Функция, которая всегда бросает исключение - тип Nothing fun fail(message: String): Nothing { throw IllegalStateException(message) } // Функция, которая никогда не завершается - тип Nothing fun infiniteLoop(): Nothing { while (true) { /* ... */ } } // Функция, которая возвращает Unit - нормальное завершение без результата fun logMessage(message: String): Unit { println(message) } // Использование Nothing в выражении val result = if (isValid) "OK" else fail("Invalid state") // Здесь fail() имеет тип Nothing, поэтому result будет String
Как отвечать на собеседовании
Начни с определения: Nothing - тип без значений, Unit - тип с одним значением. Подчеркни, что Nothing - subtype всех типов, и это позволяет использовать его в выражениях. Приведи пример с throw и TODO(). Объясни, что Unit - это аналог void, но полноценный тип. Если спросят про Nothing? - упомяни, что это nullable-версия, которая может быть либо null, либо ничего (то есть только null).
Что проверяет интервьюер
Интервьюер проверяет понимание системы типов Kotlin: разницу между отсутствием значения и отсутствием результата. Важно показать, что ты понимаешь, как Nothing участвует в выводе типов и почему компилятор позволяет присваивать его любому типу. Также проверяется знание стандартной библиотеки (TODO, throw).
Типичные ошибки
- Путать
Nothingсnull- это разные вещи:null- значение,Nothing- тип. - Считать, что
Unit- это то же самое, чтоvoidв Java (в Kotlin это полноценный тип). - Не понимать, почему
Nothingможно использовать в выражениях сifилиwhen- из-за subtype-отношения. - Забывать, что
Nothing?существует и имеет только одно значение -null.
> Похожие задачи по mobile
Можно ли пометить лямбду как inline в Kotlin
Что такое companion objects в Kotlin
Что такое reified в inline функциях Kotlin и зачем он нужен
В чем отличие launch от async в Kotlin Coroutines
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью