Что выведет код 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 ошибок.
Ещё по теме «Дженерики и вариантность»
- Проверка is List<String> и стирание типов
- Вариантность в объявлении и в месте использования
- Как обойти стирание типов
- Инвариантность, out и in
- Контравариантность in T
- Конфликт перегрузок из-за стирания
- Почему List<String> можно передать как List<Any>
- Что означает out T