Read a subtype value through a producer of a base type.

Out Variance

VarianceOut.kt
open class Animal(val name: String)
class Dog(name: String) : Animal(name)

class Source<out T>(private val item: T) {
    fun get(): T {
        return item
    }
}

fun readAnimal(source: Source<Animal>): String {
    val animal = source.get()
    return "animal:${animal.name}"
}

fun main() {
    val name = 
    val dogSource: Source<Dog> = Source(Dog(name))
    val label = readAnimal(dogSource)

    println("name=$name")
    println("label=$label")
}
open class Animal(val name: String)
class Dog(name: String) : Animal(name)

class Source<out T>(private val item: T) {
    fun get(): T {
        return item
    }
}

fun readAnimal(source: Source<Animal>): String {
    val animal = source.get()
    return "animal:${animal.name}"
}

fun main() {
    val name = 
    val dogSource: Source<Dog> = Source(Dog(name))
    val label = readAnimal(dogSource)

    println("name=$name")
    println("label=$label")
}
open class Animal(val name: String)
class Dog(name: String) : Animal(name)

class Source<out T>(private val item: T) {
    fun get(): T {
        return item
    }
}

fun readAnimal(source: Source<Animal>): String {
    val animal = source.get()
    return "animal:${animal.name}"
}

fun main() {
    val name = 
    val dogSource: Source<Dog> = Source(Dog(name))
    val label = readAnimal(dogSource)

    println("name=$name")
    println("label=$label")
}
variance `out` marks a generic type parameter that is only produced by the class.