Ответ
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> или коллбэках, где тип — только входной параметр.