covariância de genéricos java

Estou com problemas para entender o seguinte artigo: http://www.ibm.com/developerworks/java/library/j-jtp01255.html

Sob,

Genéricos não são covariantes

o autor afirma,

Porque ln é uma lista, adicionando um float para ele parece perfeitamente legal. Mas se tivéssemos um alias de li, então quebraria a promise de segurança de tipos implícita na definição de li – que é uma lista de inteiros, e é por isso que os tipos genéricos não podem ser covariantes.

Não consigo entender a parte em que diz “se eu tivesse um alias de li”. O que o autor quer dizer com pseudônimo? (Referência?). O trecho de código acima da linha citada parece ilustrar o que é ilegal em java e não por que. Seria muito útil para mim se alguém pudesse explicar com um exemplo. Desde já, obrigado.

List li = new ArrayList(); List ln = li; // illegal ln.add(new Float(3.1415)); 

Em Java, Integer herda de Number (java.lang.Number) , então, intuitivamente, qualquer coisa que seja um Integer (java.lang.Integer) também é um número, mas o que esse artigo aponta é que, com os genéricos, isso não funciona maneira, porque considerando esse exemplo, você pode acabar colocando um float (que é um Number) em um List , o que é ilegal porque um float não é um inteiro.

Conclusão: os genéricos não são covariantes.

Nota: Eu recomendo que você leia Effective Java (2nd Edition) Capítulo 5: Genéricos.

Se você pudesse fazer algo assim:

 List foo; List bar; foo = new ArrayList(); bar = foo; foo.add(1.0f); bar.add("Hello"); 

as coisas iam muito mal. Neste exemplo, bar é um alias para foo, e se você pudesse fazê-lo, perderia o tipo de segurança que é a principal razão pela qual os genéricos existem.

 public class vechicle { void drive(){ } } class car extends vechicle{ //Covariance vechicle getObject(){ return new car(); } //contravariance car getmyObject(){ return (car) new vechicle(); } }