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.