Sobes.tech
Junior — Middle

Můžete vysvětlit koncept kontravariance v generikách Kotlin a jak ovlivňuje typovou bezpečnost?

sobes.tech AI

Odpověď od AI

Kontravarianta v Kotlinu je označena klíčovým slovem in a vztahuje se na parametry typu v generikách, které se používají pouze k přijímání hodnot (vstupní parametry). To znamená, že pokud máte třídu Consumer<in T>, pak Consumer<SuperType> může být přiřazena proměnné typu Consumer<SubType>, tj. směr nahrazení typů je opačný vůči dědičnosti.

To pomáhá zajistit typovou bezpečnost, umožňuje použití obecnějšího typu tam, kde se očekává specifičtější, ale zakazuje operace, které by mohly vést k chybám za běhu.

Příklad:

interface Consumer<in T> {
    fun consume(item: T)
}

open class Animal
class Cat : Animal()

fun feedCat(consumer: Consumer<Cat>) {
    consumer.consume(Cat())
}

val animalConsumer: Consumer<Animal> = object : Consumer<Animal> {
    override fun consume(item: Animal) {
        println("Krmení zvířete")
    }
}

// Díky kontravarianci lze předat Consumer<Animal> tam, kde se očekává Consumer<Cat>
feedCat(animalConsumer)

Zde může být Consumer<Animal> použit jako Consumer<Cat>, protože Consumer je kontravariantní vůči typu T. To zabraňuje chybám spojeným s nesprávným používáním typů a umožňuje flexibilní práci s generickými typy.