Explique o conceito de invariância em genéricos Kotlin e por que ela é usada
sobes.tech IA
Resposta da IA
A invariância em Kotlin significa que, se tiver um tipo genérico Generic<T>, então Generic<A> e Generic<B> não estão relacionados por herança, mesmo que A seja um subtipo de B. Ou seja, Generic<A> não é um subtipo de Generic<B>, e vice-versa.
Isto é importante para evitar erros de tipo ao trabalhar com estruturas de dados mutáveis. Por exemplo, se MutableList<String> fosse um subtipo de MutableList<Any>, então seria possível adicionar à lista um objeto de outro tipo, o que violaria a segurança de tipos.
Em Kotlin, a invariância é usada por padrão para coleções mutáveis e outros tipos onde o conteúdo pode mudar. Para maior flexibilidade, existem a covariância (out) e a contravariância (in), que permitem expandir ou restringir tipos de forma segura em certos casos.
Exemplo de um tipo invariante:
class Box<T>(var value: T)
val boxString: Box<String> = Box("texto")
// val boxAny: Box<Any> = boxString // Erro de compilação: Box<String> não é um subtipo de Box<Any>
Assim, a invariância ajuda a manter a segurança de tipos estrita ao trabalhar com tipos genéricos.