Junior
52
questionbank

Какие виды дженериков вы знаете?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

Инвариантные, ковариантные и контравариантные.

  • Инвариантность: Тип List<A> не является подтипом List<B> и наоборот, даже если A является подтипом B. Тип сохраняется точно.
  • Ковариантность (out): Позволяет использовать подтипы. List<A> является подтипом List<B>, если A является подтипом B. Используется для выходных параметров (возвращаемых значений).
kotlin
  • Контравариантность (in): Позволяет использовать супертипы. List<B> является подтипом List<A>, если A является подтипом B. Используется для входных параметров (аргументов).
kotlin

В Kotlin эти концепции реализуются с помощью аннотаций out и in на параметрах типов. В Java используется wildcards (? extends для ковариантности и ? super для контравариантности).

ТипНазначениеКлючевое слово (Kotlin)Wildcard (Java)Разрешено чтениеРазрешена запись
ИнвариантныйТочное совпадение типаНетНетДаДа
КовариантныйИспользование подтипов (producer - "out")out? extends TДаНет
КонтравариантныйИспользование супертипов (consumer - "in")in? super TНетДа