Что такое in у дженериков

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

Ответ

in в дженериках Kotlin обозначает контравариантность — тип может быть только потребляемым (входным параметром), но не возвращаемым значением.

interface Consumer<in T> {
    fun consume(item: T) // T можно передавать в метод
    // fun produce(): T — ошибка, нельзя возвращать T
}

val stringConsumer: Consumer<String> = object : Consumer<CharSequence> {
    override fun consume(item: CharSequence) = println(item)
}

Здесь Consumer<CharSequence> можно присвоить Consumer<String>, так как любой String — это CharSequence.
Используется, например, в Comparable<T> или коллбэках, где тип — только входной параметр.