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.