generic i dad

Upload: jonathan-bernal

Post on 10-Jan-2016

1 views

Category:

Documents


0 download

DESCRIPTION

Genericidad en java

TRANSCRIPT

Genricos Los Genricos aaden estabilidad a su cdigo, haciendo que ms errores sean detectables en tiempo de compilacin.Por qu utilizar los genricos?En pocas palabras, los genricos permitentipos(clases e interfaces) para ser parmetros en la definicin de clases, interfaces y mtodos.Los parmetros de tipo proporcionan una forma para que usted pueda volver a usar el mismo cdigo con diferentes entradas.El cdigo que utiliza los genricos tiene muchas ventajas sobre el cdigo no genrico: Controles ms fuertes de tipo en tiempo de compilacin.Compilador Java aplica fuerte tipo de chequeo a cdigos genricos y asuntos de errores de cdigo por si el cdigo viola algn tipo de seguridad.La fijacin de los errores en tiempo de compilacin es ms fcil que la fijacin de los errores de ejecucin, que puede ser difcil de encontrar. . Eliminacin de los casteos Habilitacin de los programadores para implementar algoritmos genricos.Mediante el uso de los genricos, los programadores pueden implementar algoritmos genricos que trabajan en las colecciones de diferentes tipos, puede ser personalizado, y son de tipo seguro y fcil de leer.Tipos genricosUntipo genricoes una clase genrica o interfaz que est parametrizado con tipos.Unaclase genricase define con el siguiente formato:nombre de la clase {/ * ... * /}

Una clase sin utilizar genricos seria:

public class Box { private Object object;

public void set(Object object) { this.object = object; } public Object get() { return object; }}Reescribindolo la clase anterior utilizando genricos quedara de la siguiente manera:public class Box { // T stands for "Type" private T t; public void set(T t) { this.t = t; } public T get() { return t; }}La seccin tipo de parmetro est delimitado por parntesis angulares(),seguido del nombre de la clase.Se especifica losparmetros de tipo(tambin llamadasvariables detipo) como T1,T2,..., yTn.Por convencin, los nombres de los parmetros de tipo son letras individuales, en maysculas. Sin esta convencin, sera difcil decir la diferencia entre una variable de tipo y una clase o interfaz nombre comn.Los nombres de los parmetros tipo ms comnmente utilizados son: E - Element (used extensively by the Java Collections Framework) K - Key N - Number T - Type V - Value S,U,V etc. - 2nd, 3rd, 4th typesInvocando y Instanciar un tipo genricoPara hacer referencia a una clase genricaBox desde de su cdigo, debe realizar unainvocacin de tipogenrico,que sustituye aTcon algn valor concreto, comoEntero:Box integerBox = new Box ();

El diamanteEn Java SE 7 y versiones posteriores, puede reemplazar los argumentos de tipo necesarios para invocar el constructor de una clase genrica con un conjunto vaco de argumentos de tipo () siempre que el compilador pueda determinar o inferir, los argumentos de tipo del contexto.Este par de parntesis angulares, , es informalmente llamadoeldiamante.Por ejemplo, puede crear una instancia deBox con la siguiente declaracin:Box integerBox = new Box ();

Mtodos genricosMtodos genricosson mtodos que introducen sus propios parmetros de tipo.Esto es similar a lo que se declara un tipo genrico, pero el alcance del parmetro de tipo se limita al mtodo en el que se declara.La sintaxis de un mtodo genrico incluye un parmetro de tipo, dentro de parntesis angulares, y se presenta antes del tipo de retorno del mtodo.La claseUtilincluye un mtodo genrico,comparare, que compara un par de objetos:

public class Util { public static boolean compare(Pair p1, Pair p2) { return p1.getKey().equals(p2.getKey()) && p1.getValue().equals(p2.getValue()); }}Parmetros de Tipo AcotadosPuede haber momentos en los que desea restringir los tipos que se pueden utilizar como argumentos de tipo en un tipo parametrizado.Por ejemplo, un mtodo que funciona con nmeros solamente podra querer aceptar casos deNmeroo de sus subclases. Los parmetros de tipo acotadosson para eso.Para declarar un parmetro de tipo acotado, escriba el nombre del parmetro de tipo, seguido por la palabra claveextends, seguido de su limite superior,que en este ejemplo esNumber.public class Box {

private T t;

public void set(T t) { this.t = t; }

public T get() { return t; }

public void inspect(U u){ System.out.println("T: " + t.getClass().getName()); System.out.println("U: " + u.getClass().getName()); }

public static void main(String[] args) { Box integerBox = new Box(); integerBox.set(new Integer(10)); integerBox.inspect("some text"); // error: this is still String! }}La instruccin integerBox.inspect("some text"); dara error en tiempo de compilacin porque el argumento recibido es un String el cual no es un subtipo de Number.

Genricos, Herencia y subtiposEs posible asignar un objeto de un tipo a un objeto de otro tipo, siempre que los tipos son compatibles.Por ejemplo, puede asignar unIntegera unObject, ya que Objectes un subtipo deInteger:Object someObject = new Object ();Integer someInteger = new Integer (10);someObject = someInteger; // OKLo mismo ocurre con los genricos.Puede realizar un tipo de invocacin genrica, pasandoNumbercomo argumento de tipo, y cualquier invocacin subsiguiente de esta se le permitir si el argumento es compatible conNumber:public void someMethod(Number n) { /* ... */ }

someMethod(new Integer(10)); // OKsomeMethod(new Double(10.1)); // OKAhora consideremos el siguiente mtodo:public void boxTest (Box n) {/ * ... * /}Qu tipo de argumento no se acepta?Al mirar a su firma, se puede ver que acepta un solo argumento cuyo tipo es Box.Pero qu significa eso?Se le permite pasarBox oBox,como se podra esperar?La respuesta es "no", porqueBox yBoxno son subtipos deBox.Inferencia de tipos y de instancias de las clases genricasPuede reemplazar los argumentos de tipo necesarios para invocar el constructor de una clase genrica con un conjunto vaco de parmetros de tipo()siempre que el compilador puede deducir los argumentos de tipo a partir del contexto.Este par de parntesis angulares se informalmente llamadoel diamante.Por ejemplo, considere la siguiente declaracin de variable:Map myMap = new HashMap ();Puede sustituir el tipo parametrizado del constructor con un conjunto vaco de parmetros de tipo():Map myMap = new HashMap ();

Los ComodinesEn el cdigo genrico, el signo de interrogacin(?),Llamado elcomodn, representa un tipo desconocido.El comodn se puede utilizar en una variedad de situaciones: como el tipo de un parmetro, un campo o variable local;a veces como un tipo de retorno (aunque es mejor en la prctica de programacin ser ms especficos).El comodn nunca se usa como un argumento de tipo para un mtodo de invocacin genrica, una creacin de la instancia clase genrica o un supertipo.Comodines Acotados Superiormente Puede utilizar un comodn acotado superiormente para relajar las restricciones a una variable.Por ejemplo, digamos que usted quiere escribir un mtodo que funciona enList,List, y List;se puede lograr esto mediante el uso de un comodn acotado superiormente.Para declarar un comodn delimitado superiormente, utilice el carcter comodn('?'),Seguido por la palabra claveextends, seguido por sulmitesuperior.Para escribir el mtodo que funciona en las listas deNumbery los subtipos deNumber,comoInteger,Double,y elFloat, especificaraList.Esto se llama unalista de tipodesconocido.Hay dos escenarios donde un comodn sin lmites tiene un enfoque til: Si usted est escribiendo un mtodo que puede ser implementado utilizando la funcionalidad proporcionada por la clase Object. Cuando el cdigo es el uso de mtodos de la clase genrica que no depende del parmetro de tipo.Por ejemplo,List.sizeolist.clear.De hecho,la clase Se utiliza tan a menudo, porque la mayora de los mtodos enla clase no dependen det.Comodines acotados inferiormenteLos comodines acotados superiormente muestran que un comodn acotada superior restringe el tipo desconocido a ser un tipo especfico o un subtipo de ese tipo y se representa usando la palabra clave extends.De manera similar, un comodn delimitado inferiormente restringe el tipo desconocido para ser un tipo especfico o de unsupertipode ese tipo.Un comodn acotada inferior se expresa utilizando el carcter comodn('?'),Siguiendo por la palabras clavesper, seguida de sulmiteinferior: