Saturday, November 29, 2025

Kotlin Generics - in, out - covariant, contravariant, invariant

 https://stackoverflow.com/a/65648074

out produces T and preserves subtyping

class becomes read only

class Case<out T> {
    private val contents = mutableListOf<T>()
    fun produce(): T = contents.last()         // Producer: OK
    fun consume(item: T) = contents.add(item)  // Consumer: Error
}


in consumes T and reverses subtyping

class becomes write only

class Case<in T> {
    private val contents = mutableListOf<T>()
    fun produce(): T = contents.last()         // Producer: Error
    fun consume(item: T) = contents.add(item)  // Consumer: OK
}


Invariant produces and consumes T, disallows subtyping

class Case<T> {
    private val contents = mutableListOf<T>()
    fun produce(): T = contents.last()         // Producer: OK
    fun consume(item: T) = contents.add(item)  // Consumer: OK
}



Followers

Blog Archive