Выбор ответа Senior Дженерики и вариантность обновлено
Контравариантность in T
Вопрос
Есть interface Handler<in T> { fun handle(x: T) }. Какое присваивание корректно?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: val h: Handler<String = anyHandler. in делает тип контравариантным: подтипизация переворачивается.
Варианты ответа
val h: Handler<Any> = stringHandlerval h: Handler<String> = anyHandlerправильный ответ- Оба присваивания корректны
- Ни одно: интерфейсы с
inинвариантны
Разбор
in делает тип контравариантным: подтипизация переворачивается. Обработчик, умеющий принять любой Any, справится и со строкой, поэтому Handler<Any> подтип Handler<String>. Обратное неверно: обработчик строк не умеет принимать числа, поэтому Handler<String> нельзя использовать как Handler<Any>.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Дженерики и вариантность»
- Проверка is List<String> и стирание типов
- Вариантность в объявлении и в месте использования
- Как обойти стирание типов
- Почему List<String> можно передать как List<Any>
- Дженерики Kotlin и Java
- Ковариантный ящик и Nothing
- filterIsInstance и reified
- Что означает out T