Professional Documents
Culture Documents
Bajo la expresin soporte de genricos java proporciona dos facilidades de programacin bastante diferentes:
tipos genricos; que son clases parametrizadas por uno o ms tipos que deben ser facilitados por el programador cuando quiera usar la clase creando objetos mtodos genricos que son mtodos en los que los argumentos !"o el resultado inclu!en referencias a tipos que no se conocern #asta que va!amos a usar el mtodo
$robablemente el principal motivo para el uso de genricos en java sea la necesidad de disponer de colecciones #omogneas de objetos %listas conjuntos etc& facilitados en el paquete java&util'& (s) el ejemplo ms #abitual del uso de genricos es la clase lista genrica definida como
new ArrayList<String> es una lista de +tring new ArrayList<Integer> new ArrayList<Punto> es una lista de .nteger es una lista de objetos de clase $unto
donde todos ellos se caracterizan por crear listas #omogneas %todos los elementos son del mismo tipo' resultando programas limpios ! probablemente con menos errores& *l objetivo de los genricos con java es
desplazar a tiempo de compilacin los tradicionales errores de ejecucin que ocurr)an en programas con fuerte uso de downcasting si el compilador no se queja se puede asegurar que no #abr errores de tipo de datos %casting' en ejecucin
/uejarse quiere decir que el compilador protesta como se puede ver en el siguiente ejemplo al compilar la clase /ueue0(rra! que se usa un poco ms adelante: $ javac Queue Array!java "ote# Queue Array!java uses unc$ec%e& or unsafe operations! "ote# 'ecompile wit$ ()lint#unc$ec%e& for &etails! jam*tos$iba(a+, -c-$ome-&oc-PE.-e/s-genericos $ javac ()lint#unc$ec%e& Queue Array!java Queue Array!java#01# warning# 2unc$ec%e&3 unc$ec%e& cast foun& # java!lang!4bject re5uire&# .
ArrayList <E> !!! EnumSet <E> !!! @as$<ap <=> ?> !!! @as$Set <E> Lin%e&List <E> !!! PriorityQueue <E> !!! Stac% <E> !!!
class Pareja
class Pareja <S> .> A private S primero9 private . segun&o9 Pareja7S primero> . segun&o8 A t$is!primero 6 primero9 t$is!segun&o 6 segun&o9 B S getPrimero78 A return primero9 B . getSegun&o78 A return segun&o9 B voi& setPrimero7S primero8 A t$is!primero 6 primero9 B voi& setSegun&o7. segun&o8 A t$is!segun&o 6 segun&o9 B
class Pareja
B -uando se crean objetos de un tipo genrico #a! que proporcionar tipos concretos que determinen qu son realmente los tipos formales de la definicin&
problema
3o se pueden crear objetos de un tipo formal& 3o se pueden crear arra!s de tipos formales& new .789 new .2+,,3
ejemplo
3o se pueden sobrecargar mtodos usando class ) <.> S> A voi& meto&o7. t8 A !!! B tipos formales& voi& meto&o7S t8 A !!! B B 3o se puede usar el operador instanceof if 7/ instanceof .8
1os campos ! mtodos static %de clase' no static . t9 pueden referirse a un tipo formal& %4' static . meto&o7. t8 A !!! B 1os tipos enumerados no admiten tipos formales& enum F <.> A A> G> ; B
1as excepciones no admiten tipos formales& class E <.> e/ten&s E/ception A B (unque 25 sea un subtipo de 26
problema
7258 no es un subtipo de 7268&
ejemplo
%4' 1os tipos genricos pueden tener campos ! mtodos static con la 9nica salvedad de que no se refieran al tipo formal de la clase& +i un mtodo esttico se desea que sea genrico #a! que recurrir a mtodos genricos& *l asunto de los arra!s de tipo formal es especialmente insidioso: no se puede declarar un arra! de un tipo formal; #a! que declararlo de tipo :bject ! aplicar downcasting& 4bject23 &atos 6 new 4bject2!!!39 . / 6 7.8 &atos2!!!39 o .23 &atos 6 7.238new 4bject2!!!39 2 x ; datos<&&&=;
mtodos genricos
1os mtodos individualmente tambin pueden ser genricos& +e dice que un mtodo es genrico cuando sus argumentos !"o su resultado se refieren a un tipo formal que se deja como parmetro& 1os siguientes ejemplos muestran un uso t)pico:
mtodos genricos
<.> . primero7.23 &atos8 A for 7. t# &atos8 if 7t H6 null8 return t9 return null9 B static <.> List <.> pareja7. t8 A List <.> resulta&o 6 new ArrayList <.>789 resulta&o!a&&7t89 resulta&o!a&&7t89 return resulta&o9 B
Dado un dato de tipo T, crea una lista con dos elementos, que son dicho dato.
String23 &atos 6 List <String> bora bora 6 A null> CunoC> C&osC B9 pareja7CboraC89 System!out!println7primero7&atos889 $ara usar un mtodo genrico basta llamarlo con parmetros que casen con su definicin& *l propio compilador infiere el tipo %concreto' que debe asignar a 2 para que funcione correctamente& (l igual que las clases genricas los mtodos genricos funcionan bastante deficientemente cuando #a! que crear arra!s&
String ultima7List <String> lista8 A return lista!get7lista!siIe78 ( +89 B donde el compilador puede c#equear que llamamos al mtodo con una lista de +tring& -uriosamente java no admite en estos casos las tradicionales relaciones de #erencia sino que es necesario ajustarse exactamente a lo dic#o& *n en ejemplo anterior +tring significa 9nica ! exclusivamente +tring no siendo aceptable subtipos de dic#a clase& 3:2(: *l uso tradicional de la #erencia dice que donde se admite un tipo 2 es posible emplear cualquier subtipo de 2& ( fin de generalizar java introduce una notacin espec)fica para aliviar dic#a rigidez: <T> acepta el tipo 2 ! nada ms que el tipo 2
<? extends T>
acepta el tipo 2 o cualquier subtipo de 2& *n particular <?> acepta cualquier tipo&
<? super T>
acepta el tipo 2 o cualquier supertipo de 2& *sta flexibilidad se puede usar all donde #a! tipos formales o argumentos formales: class ) <J e/ten&s .> A !!! B es un tipo genrico que slo puede instanciarse con subtipos de 2& voi& meto&o7List <J e/ten&s .> lista8 A !!! B es un mtodo que slo puede llamarse con listas de objetos que son subtipos de 2& voi& meto&o7Pareja <J> J> pareja8 es un mtodo que admite cualquier pareja de datos de cualquier tipo&