> Что такое тип 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.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью