← Назад к вопросам
Какой тип является подтипом всех типов в 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() // Никогда не выполнится
Таблица
| Unit | Nothing |
|---|---|
| Функция завершилась успешно | Функция НЕ завершилась нормально |
| Возвращает значение (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 для правильной типизации исключительных ситуаций.