← Назад к вопросам

Какой bottom type в Kotlin?

2.0 Middle🔥 61 комментариев
#JVM и память#Kotlin основы

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Bottom Type в Kotlin?

В теории типов и языках программирования, bottom type (или "нижний тип") — это тип, который не имеет значений. Это означает, что ни один объект или экземпляр не может принадлежать этому типу. В Kotlin таким типом является Nothing.

Ключевые особенности Nothing в Kotlin

  • Никаких экземпляров: Вы не можете создать объект типа Nothing. Любая попытка его инстанцирования приведет к ошибке компиляции.
  • Подтип всех типов: Nothing является подтипом любого другого типа в системе типов Kotlin (String, Int, List, User и т.д.). Это фундаментальное свойство bottom type, которое делает его полезным в определённых сценариях.

Основные применения Nothing в Kotlin

1. Маркировка функций, которые никогда не завершаются нормально

Функции, которые всегда выбрасывают исключение, завершают процесс или бесконечно循环руются, имеют возвращаемый тип Nothing. Это явно сигнализирует компилятору и разработчику, что функция никогда не вернёт корректного результата.

fun failWithMessage(message: String): Nothing {
    throw IllegalStateException(message)
}

fun infiniteLoop(): Nothing {
    while (true) {
        // Делаем что-то бесконечно
    }
}

Когда вы вызываете такую функцию, компилятор знает, что выполнение после этого вызова невозможно.

2. Использование с объединениями типов (Type Unions) и null

Это одно из самых практичных применений. Рассмотрим функцию elvis, которая имитирует оператор Элвиса (?:).

fun <T> elvis(value: T?, defaultValue: T): T {
    return value ?: defaultValue
}

Что если мы хотим, чтобы defaultValue тоже мог быть null? Мы можем сделать defaultValue: T?. Но тогда возвращаемый тип станет T?, даже если value не null. Чтобы сохранить точность типов, можно использовать Nothing?.

fun <T> strictElvis(value: T?, defaultValue: T?): T {
    // Если value не null, возвращаем value (тип T).
    // Если value null, возвращаем defaultValue (тип T?).
    // Но как объединить T и T? в тип T?
    // Компилятор знает, что Nothing? является подтипом T?.
    // Поэтому выражение ниже имеет тип T.
    return value ?: defaultValue ?: throw IllegalStateException("Both are null")
    // На практике часто используется именно throw, возвращающий Nothing.
}

Ключевой момент: поскольку Nothing является подтипом всего, Nothing? (т.е. Nullable Nothing) является подтипом любого T?. Это позволяет элегантно работать с объединениями nullable и non-nullable типов в выражениях.

3. Работа с обобщёнными типами (Generics) и пустыми коллекциями

Иногда в обобщённых функциях или классах требуется указать, что никакой конкретный тип не может быть использован. Например, пустой список.

fun emptyList(): List<Nothing> = listOf()

Вы можете присвоить этот список переменной с любым типом List<T>, потому что List<Nothing> является подтипом List<T> (в Kotlin, если Nothing <: T, то List<Nothing> <: List<T>). Это пример ковариантности (covariance) обобщённых типов.

val stringList: List<String> = emptyList() // OK, потому что List<Nothing> подтип List<String>
val intList: List<Int> = emptyList() // Также OK

Пример из стандартной библиотеки Kotlin: TODO()

Функция TODO() — прекрасный пример использования Nothing в реальном коде. Она выбрасывает исключение NotImplementedError и имеет возвращаемый тип Nothing. Это позволяет вам временно заглушить нереализованные части кода, сохраняя корректность типов.

fun calculateSomething(): Int {
    // Временная заглушка
    TODO("Implement this calculation later")
    // Компилятор считает, что после TODO() выполнение не продолжается,
    // поэтому формально тип возвращаемого значения здесь — Nothing,
    // но поскольку Nothing подтип Int, это корректно.
}

Отличие от Unit

Важно не путать Nothing с Unit. Unit в Kotlin — это тип, имеющий единственное значение (аналог void в Java, но с одним экземпляром). Unit используется для функций, которые возвращают "ничего значимого", но завершаются нормально. Nothing же вообще не имеет значений и означает "никогда не завершается успешно".

Заключение

Bottom type Nothing в Kotlin — это мощный инструмент системы типов, который позволяет:

  • Явно декларировать невозвращаемые функции (через исключения или бесконечные циклы).
  • Элегантно работать с nullable типами и объединениями типов в выражениях благодаря его свойству быть подтипом всего.
  • Создавать абстрактные обобщённые конструкции, такие как пустые коллекции, которые можно безопасно присваивать переменным любого конкретного типа.
  • Улучшать безопасность и точность типов в коде, давая компилятору дополнительную информацию для анализа потока выполнения.

Таким образом, Nothing — это не просто теоретическая концепция, а практический тип, активно используемый в стандартной библиотеке и дизайне языка Kotlin для повышения надёжности и выразительности кода.