Тип Nothing в Kotlin является специфическим типом, который не имеет экземпляров. Его основное назначение в дженериках — указывать на отсутствие возвращаемого значения или на ситуацию, когда поток выполнения не завершается нормально (например, при выбросе исключения).
Особенности использования Nothing в дженериках:
Covariance (Ковариантность): Nothing является подтипом любого другого типа (Any? в конечном итоге). Благодаря этому, если дженерик объявлен с ковариантным параметром (out), то List<Nothing> может быть присвоен переменной типа List<String> (или List<Any>). Это полезно, например, для представления пустой коллекции с неопределенным типом элементов.
kotlin
Contravariance (Контравариантность): Если дженерик объявлен с контравариантным параметром (in), использование Nothing в качестве верхнего ограничения (in Nothing) не имеет практического смысла, поскольку Nothing является самым нижним типом в иерархии.
Invariant (Инвариантность): Для инвариантных дженериков (MutableList<T>), MutableList<Nothing> не является подтипом MutableList<String>.
kotlin
Использование в качестве возвращаемого типа: Функции, которые всегда выбрасывают исключение, могут явно указывать Nothing в качестве возвращаемого типа. Это четко сигнализирует компилятору и другим разработчикам, что функция никогда не вернет значение.
kotlin
Ограничения (Constraints): Nothing можно использовать в ограничениях дженериков, но его применение в качестве нижнего ограничения (<T : Nothing>) обозначает, что тип T может быть только Nothing (или, по сути, никогда не экземпляризироваться). Использование Nothing в качестве верхнего ограничения <T : Any?> не добавляет новых ограничений, так как любой тип по умолчанию является подтипом Any?.
В общем, Nothing в дженериках служит для явного указания на ситуации "нет экземпляра" или "нет возвращаемого значения", особенно в контексте ковариантности, позволяя работать с коллекциями, которые "никогда не будут содержать элементы".