Что выведет код Middle Дженерики и вариантность обновлено

Ковариантный ящик и Nothing

Вопрос

Что выведет код? По строке на каждый вывод.

sealed interface Res<out T>
data class Ok<T>(val v: T) : Res<T>
data object Fail : Res<Nothing>

fun <T> Res<T>.orElse(d: T): T = when (this) {
    is Ok -> v
    Fail -> d
}

fun main() {
    val a: Res<String> = Ok("x")
    val b: Res<String> = Fail
    val c: Res<Any> = a
    println(a.orElse("default"))
    println(b.orElse("default"))
    println(c)
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: x, default, Ok(v=x). Fail объявлен как Res<Nothing, а так как Res ковариантен по T и Nothing подтип любого типа, Fail подходит под Res<String.

Что выведет

x
default
Ok(v=x)

Разбор

Fail объявлен как Res<Nothing>, а так как Res ковариантен по T и Nothing подтип любого типа, Fail подходит под Res<String>. По той же ковариантности Res<String> присваивается в Res<Any>. orElse берёт значение из Ok или запасное для Fail.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.