You are on page 1of 5

Genricos [generics] (concepto)

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

public interface List<E> public class ArrayList<E> implements List<E>


donde * queda a definir& +e dice que * es un tipo formal& *n ingls se suele emplear la expresin type parameter para referirse a esos parmetros formales que no se refieren a valores sino a tipos de valores& *n la traduccin al espa,ol parmetros de tipo suena mu! extra,o por lo que emplearemos la forma ms tcnica tipo formal indicando que cuando se va!a a utilizar la clase #a! que proporcionar un tipo real& -on esta clase genrica podemos crear objetos de diferentes tipos

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&# .

. / 6 7.8 &ata2,39 : + warning

clases genricas en el package java.util


*l paquete java&util proporciona varias clases genricas& 1a siguiente relacin no pretende ser ex#austiva sino aquellas que el autor personalmente considera de uso ms frecuente: interface interface interface interface interface interface interface interface interface class class class class class class class ;ollection <E> e/ten&s Iterable <E> ;omparator <E> Enumeration <E> List <E> e/ten&s ;ollection <E> <ap <=> ?> Queue <E> e/ten&s ;ollection <E> Set <E> e/ten&s ;ollection <E> Sorte&<ap <=> ?> e/ten&s <ap <=> ?> Sorte&Set <E> e/ten&s Set <E>

ArrayList <E> !!! EnumSet <E> !!! @as$<ap <=> ?> !!! @as$Set <E> Lin%e&List <E> !!! PriorityQueue <E> !!! Stac% <E> !!!

creacin de clases genricas


*l siguiente ejemplo muestra como crear un objeto que es una asociacin de dos datos de tipos formales + ! 2:

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&

uso de Pareja <S, T>


Pareja <String> String> te/tos 6 new Pareja <String> String>7C$olaC> Ca&iosC89 System!out!println7te/tos!getPrimero7889 System!out!println7te/tos!getSegun&o7889 Pareja <String> "umber> tabla 6 new Pareja <String> "umber>7CpiC> 1!+D+E89 System!out!println7tabla!getPrimero7889 System!out!println7tabla!getSegun&o7889

limitaciones de las clases genricas en java


1a introduccin de clases genricas en java es tard)a ! adolece de algunas importantes limitaciones derivadas de la necesidad de #acer compatible el cdigo creado con anterioridad& 1a siguiente relacin no pretende explicar por qu slo constata las limitaciones&

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 array de datos de tipo T, devuelve el primero que no es null.

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&

tipos formales acotados


*xistiendo tipos ! mtodos genricos los mtodos pueden recibir o devolver objetos de dic#os tipos&

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&

You might also like