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

Какое место в иерархии типов у Nothing?

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

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

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

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

Место Nothing в иерархии типов Kotlin

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

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

  1. Подтип всего:

    • Nothing можно подставить везде, где ожидается любой другой тип
    • val value: String = throw Exception() — компилируется, потому что throw возвращает Nothing
  2. Ненаселенный тип (uninhabited type):

    • Нет значений, имеющих тип Nothing
    • Нельзя создать экземпляр Nothing
    • Любая функция, возвращающая Nothing, никогда не завершается нормально

Практическое использование

// 1. Функции, которые никогда не возвращают управление
fun fail(message: String): Nothing {
    throw RuntimeException(message)
}

// 2. Использование в условиях и элвис-операторе
val name: String = nullableName ?: fail("Name is required")

// 3. Коллекции Nothing
val emptyList: List<Nothing> = listOf()
val emptyListGeneric: List<T> = emptyList() // Благодаря ковариантности

Взаимодействие с системой типов

// Nothing совместим со всеми типами
fun example() {
    val asInt: Int = getNothing() // OK
    val asString: String = getNothing() // OK
    val asAny: Any = getNothing() // OK
}

fun getNothing(): Nothing {
    throw Exception()
}

Nothing vs Unit

Важно различать Nothing и Unit:

NothingUnit
Никогда не возвращает результатВозвращает единственное значение Unit
Представляет отсутствие значения на уровне типаПредставляет отсутствие осмысленного возвращаемого значения
Используется для завершающих функцийИспользуется для функций с побочными эффектами
// Unit — есть одно значение, Nothing — нет значений
fun returnsUnit(): Unit {} // Всегда возвращает Unit
fun returnsNothing(): Nothing { while(true) {} } // Никогда не возвращается

Nothing? — особый случай

Nothing? — это тип, имеющий только одно значение: null. Это минимальный nullable-тип в системе:

val nullValue: Nothing? = null
// Можно присвоить любому nullable-типу
val nullableString: String? = nullValue
val nullableInt: Int? = nullValue

Значение для разработчика Android

  1. Безопасность типов: Позволяет выражать невозможные ситуации на уровне системы типов
  2. Улучшение анализа потока управления: Компилятор понимает, что после вызова функции, возвращающей Nothing, код не выполняется
  3. Универсальные пустые коллекции: Благодаря List<Nothing> можно создавать безопасные пустые коллекции

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

Какое место в иерархии типов у Nothing? | PrepBro