> В каких случаях использовать модификаторы 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 - когда только в аргументах. Если и там, и там - оставляйте инвариантным (без модификаторов).
> Похожие задачи по mobile
Что такое contracts в Kotlin и когда их используют?
Можно ли изменить значение val в дата классе через рефлексию
Что такое дефолтный поток в Kotlin Coroutines?
Какие пакеты для проверки состояния сети во Flutter используются
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью