java generics alias covariance

java generics covariance



alias (3)

Si pudieras hacer algo como esto:

List<Float> foo; List<Object> bar; foo = new ArrayList<Float>(); 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 genéricos.

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

Debajo,

Los genéricos no son covariantes

el autor declara,

Debido a que ln es una Lista, agregar un Flotante a ella parece perfectamente legal. Pero si ln tenía un alias con li, entonces 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 genéricos no pueden ser covariantes.

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


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


List<Integer> li = new ArrayList<Integer>(); List<Number> ln = li; // illegal ln.add(new Float(3.1415));

En Java, Integer hereda de Number (java.lang.Number) , de manera intuitiva, todo lo que es un Integer (java.lang.Integer) también es un número, pero lo que el artículo señala es que con los genéricos no funciona. De esta forma, dado que en ese ejemplo, podrías terminar poniendo un flotador (que es un Número) en una List<Integer> , lo cual es ilegal porque un flotador no es un número entero.

Conclusión: los genéricos no son covariantes.

Nota: le recomiendo que lea el Capítulo 5: Genéricos de Effective Java (2nd Edition).