Invariance é representado pelo <T>
Se refere à situação em que nenhum relacionamento de subtipo é permitido entre tipos genéricos. Quando um tipo genérico é invariance, isso significa que não há relação entre Generic "A" e Generic "B ", mesmo se A e B estiverem relacionados por subtipagem. Não pode usar um tipo genérico onde é esperado outro tipo genérico que não seja exatamente o mesmo.
Covariance representado pelo <out T>
Em resumo é o oposto do invariance, com covariante a gente consegue utilizar o subtipo para relacionar as classes.
Exemplo de ivariance
public class Array <T> {}
public inline fun <reified @PureReifiable T> arrayOf(vararg elements: T): Array<T>
ou seja se eu usar o código dessa forma, não vai funcionar
var exemplo1 = arrayOf<Int>(1)
var exemplo2 = arrayOf<Number>(1)
exemplo1 = exemplo2
ERROR:
Type mismatch.
Required: Array<Int>
Found: Array<Number>
Aqui tentei aplicar o covariance
Fiz o seguinte, repliquei assinatura e coloquei o out, mesmo assim não funcionou. Caso as informações acima esteja certa, o que há de errado com o código abaixo?
fun covarianceTest() {
var exemplo1 = arrayOf2<Int>(1)
var exemplo2 = arrayOf2<Number>(1)
exemplo1 = exemplo2
}
inline fun <out T> arrayOf2(vararg elements: T): Array2<out T>{
}
class Array2<out T>{
val nome:String = ""
}