Leg uit wat het concept van invariantie in Kotlin-generics is en waarom het wordt gebruikt
sobes.tech AI
Antwoord van AI
Invariantie in Kotlin betekent dat als je een generiek type Generic<T> hebt, Generic<A> en Generic<B> niet gerelateerd zijn door een erfenisrelatie, zelfs als A een subtype is van B. Met andere woorden, Generic<A> is geen subtype van Generic<B>, en vice versa.
Dit is belangrijk om typefouten te voorkomen bij het werken met wijzigbare datastructuren. Bijvoorbeeld, als MutableList<String> een subtype was van MutableList<Any>, dan zou je een object van een ander type kunnen toevoegen aan de lijst, wat de typeveiligheid zou schenden.
In Kotlin wordt invariantie standaard gebruikt voor mutable collecties en andere types waarbij de inhoud kan veranderen. Voor meer flexibiliteit bestaan covariantie (out) en contravariantie (in), die het veilig uitbreiden of verkleinen van types in bepaalde gevallen mogelijk maken.
Voorbeeld van een invariante type:
class Box<T>(var value: T)
val boxString: Box<String> = Box("tekst")
// val boxAny: Box<Any> = boxString // Compileerfout: Box<String> is geen subtype van Box<Any>
Zo helpt invariantie om strikte typeveiligheid te behouden bij het werken met generieke types.