Sobes.tech
Junior — Middle

Spiega il concetto di invariabilità nei generici di Kotlin e perché viene utilizzato.

sobes.tech AI

Risposta dell'AI

L'invarianza in Kotlin significa che se hai un tipo generico Generic<T>, allora Generic<A> e Generic<B> non sono collegati da una relazione di ereditarietà, anche se A è un sottotipo di B. In altre parole, Generic<A> non è un sottotipo di Generic<B>, e viceversa.

Questo è importante per evitare errori di tipo quando si lavora con strutture di dati mutabili. Ad esempio, se MutableList<String> fosse un sottotipo di MutableList<Any>, si potrebbe aggiungere alla lista un oggetto di un altro tipo, violando la sicurezza del tipo.

In Kotlin, l'invarianza viene usata di default per le collezioni mutabili e altri tipi in cui il contenuto può cambiare. Per maggiore flessibilità, esistono la covarianza (out) e la contravarianza (in), che permettono di espandere o restringere i tipi in modo sicuro in determinati casi.

Esempio di un tipo invariante:

class Box<T>(var value: T)

val boxString: Box<String> = Box("testo")
// val boxAny: Box<Any> = boxString // Errore di compilazione: Box<String> non è un sottotipo di Box<Any>

In questo modo, l'invarianza aiuta a mantenere la sicurezza del tipo rigorosa quando si lavora con tipi generici.