Под "дочерним" классом я предполагаю, что вы имеете в виду sub type? Если да, то Nothing
действительно является подтипом любого другого типа в Kotlin. Его противоположный аналог Any?
, который является типом super каждого типа в Kotlin.
Nothing
, позволяет работать таким функциям, как TODO()
. Реализация этой функции:
public inline fun TODO(): Nothing = throw NotImplementedError()
, указывающая, что TODO()
никогда ничего не возвращает , т. Е. Всегда выдает исключение во время выполнения. Это то, что позволяет TODO()
быть помещенным в любой контекст. Например:
fun foo(): String = TODO()
компилируется без ошибок, даже если TODO()
не возвращает String
, потому что компилятор знает, что TODO()
никогда не вернет ничего (более конкретно, Nothing
является подтипом из String
и, следовательно, "возвращает" действительный тип в этом выражении.)
Теперь перейдем к вашему вопросу:
Я думаю, что код Error(e)
вызовет ошибку, потому что он не может вернуть Result<List<Task>>
.
Мы отметили, что Nothing
действительно подтип любого другого типа.
Мы также должны отметить, что определение закрытого Result
класса, т. е. Result<out R>
, использует дисперсионную аннотацию out
. Это означает, что параметр типа T
из Result
всегда только возвращается из Result
и никогда не используется Result
, т.е. Result
ковариантен в T
. Цитирование Kotlin документации:
Общее правило: когда объявлен параметр типа T
класса C
, это может произойти только в out -позиция в членах C
, но взамен C<Base>
может смело быть супертипом C<Derived>
.
Объединение этого правила со знанием того, что Nothing
является подтипом любого другого типа, это позволяет Error(e)
, который реализует Result<Nothing>
, быть допустимым возвращаемым значением Result<List<Task>>
, и, следовательно, нет ошибки в указанной вами строке кода.