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.
No tenía idea del motivo de tan cerrado y «absurdo» comportamiento. Gracias por iluminarnos a todos :p
También acabo de descubrir la existencia del tipo ?, lo que se aprende.