Что такое инвариантность Generic в Kotlin

«Что такое инвариантность Generic в Kotlin» — вопрос из категории Kotlin, который задают на 24% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Kotlin дженерики по умолчанию инвариантны (out и in не указаны). Это значит, что Box<Cat> не является ни подтипом, ни надтипом Box<Animal>, даже если Cat наследует Animal.

Пример инвариантного дженерика:

class Box<T>(var item: T)

val catBox: Box<Cat> = Box(Cat())
val animalBox: Box<Animal> = catBox // Ошибка компиляции!

Для ковариантности (Box<Cat>Box<Animal>) используется out:

class Box<out T>(val item: T)

Для контравариантности (Box<Animal>Box<Cat>) — in:

class Box<in T>(fun consume(item: T))