An out position is a place where a generic type parameter produces a value rather than consumes one. A function return type puts T in the out position; a function parameter puts T in the in position. Kotlin's out modifier requires every use of T to remain in out positions, making covariance type-safe. section 11.3.3
A covariant producer
interface Producer<out T> { fun produce(): T } Here, produce returns T, so T is used only in an out position. Producer<Cat> can therefore be used where Producer<Animal> is expected: the producer supplies an Animal-compatible value, but callers cannot pass arbitrary Animals into it. section 11.3.3
A collection-like Herd demonstrates the practical benefit. Herd<out T> can be passed to feedAll, which expects Herd<Animal>, when the actual herd is Herd<Cat>. Kotlin's read-only List follows the same producer pattern, while MutableList cannot safely accept the same covariance because add consumes T.

