Sobes.tech
Junior — Middle

Môžete vysvetliť koncept kontravariancie v generikách Kotlin a ako ovplyvňuje typovú bezpečnosť?

sobes.tech AI

Odpoveď od AI

Kontravariancia v Kotlinu je označená kľúčovým slovom in a vzťahuje sa na parametre typu v generikách, ktoré sa používajú iba na prijímanie hodnôt (vstupné parametre). To znamená, že ak máte triedu Consumer<in T>, potom Consumer<SuperType> môže byť priradený k premennej typu Consumer<SubType>, teda smer náhrady typov je opakom dedičnosti.

Toto pomáha zabezpečiť typovú bezpečnosť, umožňuje používať všeobecnejší typ tam, kde sa očakáva špecifickejší, ale zakazuje operácie, ktoré by mohli viesť k chybám počas behu.

Prí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("Kŕmiť zviera")
    }
}

// Vďaka kontravariancii je možné odovzdať Consumer<Animal> tam, kde sa očakáva Consumer<Cat>
feedCat(animalConsumer)

Tu môže byť Consumer<Animal> použitý ako Consumer<Cat>, pretože Consumer je kontravariabilný voči typu T. To zabraňuje chybám súvisiacim s nesprávnym používaním typov a umožňuje flexibilnú prácu s generickými typmi.