Genealogia de genericos en Java5

12 ene 2007

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.

Comparte esta entrada:
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • Meneame
  • RSS
  • Twitter

3 Respuestas Para “Genealogia de genericos en Java5”

  1. Félix García Borrego 12 de enero de 2007 at 20:44 hrs. #

    No tenía idea del motivo de tan cerrado y “absurdo” comportamiento. Gracias por iluminarnos a todos :p

  2. Jorge Torres Chacón 15 de enero de 2007 at 09:17 hrs. #

    También acabo de descubrir la existencia del tipo ?, lo que se aprende.

  3. Black Hat Millionaire 21 de noviembre de 2008 at 00:49 hrs. #

    Glad I just found your wordpress blog through Google.

    Found just what I was looking for, thanks =)

    Btw, wat plugins are you using??

Deje una respuesta