Инвариантные, ковариантные и контравариантные.
List<A> не является подтипом List<B> и наоборот, даже если A является подтипом B. Тип сохраняется точно.List<A> является подтипом List<B>, если A является подтипом B. Используется для выходных параметров (возвращаемых значений).kotlin
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 | Нет | Да |