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

Можно ли создать экземпляр Nothing?

2.0 Middle🔥 81 комментариев
#Kotlin основы

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

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

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

Можно ли создать экземпляр типа Nothing в Kotlin?

Короткий ответ: нет, создать экземпляр типа Nothing напрямую невозможно. Это специальный тип в системе типов Kotlin, который не имеет значений и служит исключительно для представления «невозможного» или «недостижимого» состояния программы.

Что такое Nothing?

Nothing — это встроенный в Kotlin тип, находящийся в самом низу иерархии типов. Все остальные типы в Kotlin являются его подтипами. Это значит, что вы можете использовать Nothing там, где ожидается любой другой тип, но вы не можете присвоить ему какое-либо реальное значение.

Ключевые характеристики Nothing:

  • Не имеет экземпляров (instances). Не существует объектов, тип которых был бы Nothing.
  • Подтип всех типов. Любой класс, объект или примитив в Kotlin считается подтипом Nothing.
  • Обозначает недостижимый код. Используется компилятором для анализа потока управления.
  • Представляет результат, который никогда не возвращается. Например, функция, которая всегда бросает исключение или приводит к завершению программы.

Для чего используется Nothing?

1. Функции, которые никогда не возвращают управление

Самый распространённый случай — функции, которые всегда завершаются выбросом исключения или другим способом прерывают выполнение (например, error(), TODO(), throw). Тип их возвращаемого значения — Nothing.

fun throwException(): Nothing {
    throw IllegalStateException("Это функция никогда не завершится нормально")
}

fun fail(message: String): Nothing {
    throw RuntimeException(message)
}

fun exampleUsage() {
    val result: String = throwException() // Компилятор знает, что эта строка никогда не выполнится
    println("Этот код недостижим") // Компилятор может предупредить об этом
}

2. Тип null в обнуляемых (nullable) переменных

Когда переменная объявлена с типом Nothing?, единственное допустимое значение для неё — null.

val alwaysNull: Nothing? = null
// alwaysNull может использоваться там, где ожидается любой nullable-тип
val stringOrNull: String? = alwaysNull
val intOrNull: Int? = alwaysNull

3. Параметры типа (Generics) для обозначения пустых коллекций

В комбинации с generics Nothing может обозначать пустые множества или нереализованные варианты.

// Пример с sealed class и пустым списком
sealed class ApiResult<out T>
class Success<out T>(val data: T) : ApiResult<T>()
class Error(val message: String) : ApiResult<Nothing>()

// Пустой список, который можно привести к любому типу списка
val emptyList: List<Nothing> = listOf()
val strings: List<String> = emptyList // Безопасное приведение
val integers: List<Int> = emptyList // Безопасное приведение

Почему нельзя создать экземпляр?

Попытка создать экземпляр Nothing приведёт к ошибке компиляции, потому что:

  1. Логическое противоречие: Если бы можно было создать объект типа Nothing, его можно было бы присвоить переменной любого типа (val x: String = instanceOfNothing, val y: Int = instanceOfNothing), что нарушило бы безопасность типов.
  2. Философия типа: Nothing — это концептуальный «нижний» тип (bottom type), существующий в теории типов. Он нужен для полноты системы типов, а не для инстанцирования.
  3. Конструктор отсутствует: У класса Nothing нет конструктора, доступного для вызова.
// Все эти попытки приведут к ошибке компиляции:
// val n1 = Nothing() // Ошибка: Cannot access '<init>': it is private in 'Nothing'
// val n2: Nothing = null // Ошибка: Null can not be a value of a non-null type Nothing

Сравнение с похожими типами

  • Unit — тип с одним значением Unit, который означает «отсутствие осмысленного возвращаемого значения». Функция возвращает Unit, когда её вызывают ради побочного эффекта.
  • Any — супертип всех не-null типов в Kotlin. У него есть реальные экземпляры.
  • Any? — супертип всех типов в Kotlin, включая nullable-типы.

Заключение

Nothing — это мощный инструмент системы типов Kotlin для:

  • Статического анализа потока выполнения (компилятор понимает, что код после вызова функции, возвращающей Nothing, недостижим).
  • Безопасных приведений в generics (например, пустой список List<Nothing>).
  • Моделирования функций, которые никогда не завершаются успешно.

Создание его экземпляра противоречит самой сути этого типа и невозможно по дизайну языка. Его главная цель — быть полезным абстрактным понятием в системе типов, а не конкретным типом данных, как String или Int.

Можно ли создать экземпляр Nothing? | PrepBro