> В каких случаях использовать модификаторы in и out в дженериках Kotlin (Kotlin, Android)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: IBS

Стек: Kotlin, Android

> Пример ответа

Модификаторы in и out в дженериках Kotlin используются для управления вариантностью (variance) - то есть для указания, может ли обобщённый тип быть ковариантным (out) или контравариантным (in). Это помогает избежать небезопасных приведений типов и делает код более типобезопасным.

out (ковариантность) применяется, когда обобщённый тип только производится (возвращается из функций), но не потребляется (не передаётся в качестве аргумента). Например, для коллекций, которые только читаются:

interface Source<out T> {
    fun get(): T  // T только возвращается
}

Это позволяет присваивать Source<String> переменной типа Source<Any> - ковариантность работает в сторону супертипов.

in (контравариантность) используется, когда тип только потребляется (передаётся в функции), но не производится. Например, для компараторов или потребителей:

interface Consumer<in T> {
    fun consume(item: T)  // T только принимается
}

Здесь Consumer<Any> можно присвоить переменной Consumer<String> - контравариантность работает в сторону подтипов.

На практике в Android/Kotlin:

  • out - для List<out T> (только чтение), Flow<out T>, LiveData<out T>.
  • in - для Comparable<in T>, Function<in T, out R>, колбэков (например, (T) -> Unit).

Используйте out, когда тип фигурирует только в возвращаемых значениях, и in - когда только в аргументах. Если и там, и там - оставляйте инвариантным (без модификаторов).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью