covarianza de generics de java

Tengo problemas para entender el siguiente artículo: http://www.ibm.com/developerworks/java/library/j-jtp01255.html

Debajo,

Los generics no son covariantes

el autor dice,

Como ln es una lista, agregarle un flotador parece perfectamente legal. Pero si tuviera un alias con li, rompería la promesa de seguridad de tipo implícita en la definición de li, que es una lista de enteros, por lo que los tipos generics no pueden ser covariantes.

No puedo entender la parte donde dice “si tuviera alias con li”. ¿Qué quiere decir el autor por alias? (¿Referencia?). El fragmento de código sobre la línea citada parece ilustrar QUÉ es ilegal en Java y no POR QUÉ. Sería muy útil para mí si alguien pudiera explicar con un ejemplo. Gracias por adelantado.

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

En Java, Integer hereda de Number (java.lang.Number) , así que, intuitivamente, cualquier cosa que sea un Integer (java.lang.Integer) también es un número, pero lo que ese artículo señala es que con los generics no funciona manera, porque teniendo en cuenta ese ejemplo, podría terminar colocando un flotante (que es un Número) en una List , que es ilegal porque un flotante no es un número entero.

Conclusión: los generics no son covariantes.

Nota: Te recomiendo que leas Effective Java (2nd Edition) Capítulo 5: Generics.

Si pudieras hacer algo como esto:

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

las cosas irían MUY mal. En este ejemplo, la barra es un alias para foo, y si pudiera hacerlo, perdería el tipo de seguridad que es la razón principal por la que existen los generics.

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