Genealogia de genericos en Java5

Pregunta de certificacion; son correctas las siguientes lineas de codigo Java5?

List <Integer> li = new LinkedList <Integer> (); //#1

List <Object> lo = li; //#2

Si habilitais Java5 en vuestros Eclipse, vereis que la linea 2 no compila [ Type mismatch: cannot convert from List<Integer> to List<Object> ]. No es acaso Integer un subtipo de Object? La regla es que en general, cuando de genericos se trata, si Foo es un subtipo (subclase o subinterfaz) de Bar y G una declaracion de tipo generico, *no* se cumple que G<Foo> sea subtipo de G<Bar>. Pero por que esta limitacion?

Volviendo al ejemplo, si la linea #2 fuese valida podriamos hacer…

lo.add(new Object()); //#3

Integer i=li.get(0); //#4

En la linea #4 estariamos asignando un Object a un Integer, una superclase a su subclase. No hace falta que explique las consecuencias desagradables que esto tendria.

Afortunadamente, en Java5 si existe una superclase de todas las listas:

List <?> l_unknown = li; //#2

La lista de tipo ‘?’ si resulta ser supertipo de cualquier otra lista. Asi G<?> seria supertipo de G<Foo> y de G<Bar>.

Hala todos a jugar.

Comentarios

Comments are closed.