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

Какой тип является подтипом всех типов в Kotlin?

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

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

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

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

Nothing — подтип всех типов в Kotlin

Nothing — это специальный тип в Kotlin, который является подтипом всех остальных типов включая String, Int, Any и даже Unit. Это уникальный тип, который не имеет инстансов.

Что такое Nothing?

// Nothing — это тип, который НЕ может иметь значений
// Функция, которая возвращает Nothing, никогда не вернёт нормально

fun fail(): Nothing {
    throw IllegalArgumentException("Ошибка!")
}

val x: String = fail()  // OK! Nothing - подтип String
val y: Int = fail()     // OK! Nothing - подтип Int

Иерархия типов с Nothing

              Nothing (внизу!)
               / | | \\
              /  |  \\  \\
           String Int List ... Any

Nothing находится в самом низу иерархии типов (это bottom type), потому что он совместим со всеми типами.

Практическое применение

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

// Функция бросает исключение
fun throwError(message: String): Nothing {
    throw Exception(message)
}

// Функция бесконечно ждёт
fun waitForever(): Nothing {
    while (true) {
        Thread.sleep(1000)
    }
}

// Функция выходит из приложения
fun exitApp(): Nothing {
    System.exit(1)
}

2. Использование Nothing для типизации

// Функция может возвращать результат ИЛИ Nothing
fun getValue(id: Int): String {
    return if (id > 0) {
        "Value $id"
    } else {
        throw IllegalArgumentException("Invalid id")
    }
}

val value: String = getValue(5)  // возвращает строку
val error: String = getValue(-1)  // бросает исключение (Nothing)

3. Elvis оператор с Nothing

val x: String? = null

// Если null, используем Nothing (бросает ошибку)
val result: String = x ?: throw Exception("Value is null")

4. Require функции

// require возвращает Nothing если условие не выполнено
fun processUser(user: User?) {
    require(user != null) { "User cannot be null" }
    println(user.name)  // smart cast к User
}

Nothing vs Unit

Это часто путают! Вот ключевая разница:

// Unit - функция возвращает void (успешно, но ничего полезного)
fun doSomething(): Unit {
    println("Doing something")
}

// Nothing - функция НИКОГДА не возвращает нормально
fun doSomethingFail(): Nothing {
    throw Exception("Failed!")
}

// Использование
val x: Unit = doSomething()  // OK, функция вернулась
val y: Unit = doSomethingFail()  // Никогда не выполнится

Таблица

UnitNothing
Функция завершилась успешноФункция НЕ завершилась нормально
Возвращает значение (Unit)Не возвращает ничего
Все функции без return возвращают UnitБросает исключение или зависает

Практический пример в ViewModel

class UserViewModel : ViewModel() {
    private fun ensureNotNull(user: User?): User {
        return user ?: throw IllegalStateException(
            "User should not be null"
        )
    }
    
    fun loadUserData(userId: Int) {
        viewModelScope.launch {
            val user = repository.getUser(userId)
                ?: return@launch
            
            updateUI(user)
        }
    }
}

Nothing? - nullable Nothing

Практически никогда не используется:

val x: Nothing? = null  // OK, единственный случай
val y: Nothing? = "text"  // Ошибка!

Ключевые моменты

  • Nothing - это bottom type (внизу иерархии)
  • Nothing - подтип всех типов (совместим везде)
  • Nothing - представляет функцию, которая не возвращает нормально
  • Функции Nothing бросают исключение или зависают
  • Nothing != Unit: Unit = успешное завершение, Nothing = отсутствие завершения
  • Nothing? = null (единственный случай Nothing?)

Иерархия типов

            Any?        <- Может быть null
           /   \\
          Any   null
         /   \\
       String List
        |      |
     String? List?
        \\
      Nothing <- Подтип всех типов

Nothing - это элегантный инструмент Kotlin для правильной типизации исключительных ситуаций.

Какой тип является подтипом всех типов в Kotlin? | PrepBro