Выбор ответа Senior Дженерики и вариантность обновлено

Контравариантность in T

Вопрос

Есть interface Handler<in T> { fun handle(x: T) }. Какое присваивание корректно?

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: val h: Handler<String = anyHandler. in делает тип контравариантным: подтипизация переворачивается.

Варианты ответа

  1. val h: Handler<Any> = stringHandler
  2. val h: Handler<String> = anyHandlerправильный ответ
  3. Оба присваивания корректны
  4. Ни одно: интерфейсы с in инвариантны

Разбор

in делает тип контравариантным: подтипизация переворачивается. Обработчик, умеющий принять любой Any, справится и со строкой, поэтому Handler<Any> подтип Handler<String>. Обратное неверно: обработчик строк не умеет принимать числа, поэтому Handler<String> нельзя использовать как Handler<Any>.

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

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