Sobes.tech
Junior — Middle

Explica el concepto de invariancia en los genéricos de Kotlin y por qué se utiliza.

sobes.tech AI

Respuesta de la IA

La invariancia en Kotlin significa que si tienes un tipo genérico Generic<T>, entonces Generic<A> y Generic<B> no están relacionados por herencia, incluso si A es un subtipo de B. Es decir, Generic<A> no es un subtipo de Generic<B>, y viceversa.

Esto es importante para evitar errores de tipo al trabajar con estructuras de datos mutables. Por ejemplo, si MutableList<String> fuera un subtipo de MutableList<Any>, entonces sería posible añadir a la lista un objeto de otro tipo, lo que violaría la seguridad de tipos.

En Kotlin, la invariancia se usa por defecto para colecciones mutables y otros tipos donde el contenido puede cambiar. Para mayor flexibilidad, existen la covarianza (out) y la contravarianza (in), que permiten ampliar o reducir tipos de forma segura en ciertos casos.

Ejemplo de un tipo invariante:

class Box<T>(var value: T)

val boxString: Box<String> = Box("texto")
// val boxAny: Box<Any> = boxString // Error de compilación: Box<String> no es un subtipo de Box<Any>

De esta forma, la invariancia ayuda a mantener la seguridad de tipos estricta al trabajar con tipos genéricos.