31/07/2010

Genéricos en Java

Curso: Tecnología de la Programación II. Docente: Mg. Zoraida Vidal Melgarejo,.

1

CLASES GENÉRICAS. Los tipos genéricos o tipos parametrizados permiten definir una clase o una interfaz una sola vez y después crear objetos de ella de diferentes tipos; esto es, son un mecanismo Java que permite que un tipo pueda ser utilizado como parámetro en la definición de un método o de una clase. Las clases genéricas simplifican la implementación de clases que definen contenedores, puesto que el tipo de los objetos contenidos es un argumento en la definición de la clase. También es posible definir métodos genéricos para trabajar con un amplio número de tipos.
2

1

ArrayList. Los ejemplos mostrados a continuación definen listas de diferentes tipos utilizando la clase genérica ArrayList:  ArrayList<Integer> numeros = new ArrayList<Integer>(). 4 2 . HashMap y TreeMap.31/07/2010 CLASES GENÉRICAS. Una programación que utiliza tipos como parámetros recibe el nombre de programación genérica. que es lo que especifica el parámetro Integer. de la variable numeros. la segunda define una lista de cadenas de caracteres. La biblioteca estándar de Java presenta muchas de sus abstracciones como clases genéricas. por ejemplo. que es lo que especifica el parámetro String y la tercera define una lista de personas. que es lo que especifica el parámetro Persona. La primera declaración. define una lista de enteros. 3 CLASES GENÉRICAS.  ArrayList<Persona> personas = new ArrayList<Persona>().  ArrayList<String> nombres = new ArrayList<String>().

public class MiLista<T> { private ArrayList<T> lista. bien como parámetros del método o como tipo del valor retornado. public MiLista() { lista = new ArrayList<T>().31/07/2010 DEFINICIÓN DE CLASES GENÉRICAS. entre los signos < y >. T2> { … } Los parámetros de la lista serán utilizados para implementar los métodos de la clase. 5 DEFINICIÓN DE CLASES GENÉRICAS. } public void setElemento(T valor) { lista.get(i). } } 6 3 .add(valor). la lista de parámetros de tipo separados por comas. La definición de una clase genérica se realiza de la siguiente manera: class NombreClase<lista_de_parametros> { … } A continuación del nombre de la clase se especifican. Por ejemplo: public class MiClase<T1. } public T getElemento(int i) { return lista.

0).31/07/2010 DEFINICIÓN DE CLASES GENÉRICAS. listaNombres = new MiLista<String>(). listaNombres.println(numero). } } 7 DEFINICIÓN DE CLASES GENÉRICAS. System. listaNumeros = new MiLista<Double>().out. public class PruebaListaCadenas { public static void main(String [] args) { MiLista<String> listaNombres.println(nombre). public class PruebaListaNumeros { public static void main(String [] args) { MiLista<Double> listaNumeros.getElemento(0). System.setElemento(5. // No hay necesidad de realizar una conversión explícita // del objeto recuperado de la colección String nombre = listaNombres.getElemento(0). } } 8 4 . // No hay necesidad de realizar una conversión explícita // del objeto recuperado de la colección double numero = listaNumeros.out. listaNumeros.setElemento(“Adriana”).

ni en código fuente. ni en binario. por lo tanto no hay necesidad de hacer una conversión explícita. ni en el disco. y porque el tipo del objeto recuperado de la colección es conocido. en algún punto los Object deben ser convertidos a Persona. Simplemente sustituye T por Object y añade el código necesario para seguir proporcionando la característica de autoempaquetado / desempaquetado (autoboxing / unboxing). esto es. 9 DEFINICIÓN DE CLASES GENÉRICAS. ¿Cómo compila Java una clase genérica? No se crean múltiples copias de la clase. ni en memoria. si estamos trabajando con una lista de objetos Persona. Las colecciones genéricas son elementos de programación que permiten al compilador verificar cualquier operación que añada un objeto a la colección.31/07/2010 DEFINICIÓN DE CLASES GENÉRICAS. 10 5 . así como las conversiones explícitas necesarias.

31/07/2010 RELACIÓN ENTRE CLASES GENÉRICAS. ya que lista3 no es un objeto de una subclase de MiLista<Object>. No es válido. 11 TIPO COMODÍN. Consideremos la siguiente relación de herencia entre clases: 12 6 . el siguiente código: MiLista<Integer> lista3 = new MiLista<Integer>(). la clase ClaseG<ClaseB> no es una subclase de ClaseG<ClaseA>. y ClaseG es una clase genérica. MiLista<Object> lista4 = lista3. En general. El compilador Java lo notificará con un mensaje de error. Por ejemplo. si ClaseB es una subclase de ClaseA.

Error!! Porque la clase de p.add(new Cliente(123. se modificaría de la siguiente manera: 14 7 .37)). mostrarDatos(p). 5298. 1532.21)). 22334. “Luis Pérez”. public class PruebaHerenciaGenérica { public static void main(String args[]) { ArrayList<Persona> p = new ArrayList<Persona>().add(new Empleado(234. 28. “Gerente”. p. … ArrayList<Persona> no es una subclase de Collection<Object> } public static void mostrarDatos(Collection<Object> datos) { … } } 13 TIPO COMODÍN.31/07/2010 TIPO COMODÍN. Se escribe así: Collection<?> El código mostrado anteriormente. Entonces. p. ¿cuál es la superclase de todas las colecciones? Es una colección en la que el tipo de los elementos no sea conocido. si se desea que los tipos derivados sean aceptados en la lista genérica. 30. “Ana López”.

siempre permite extraer objetos. porque garantiza como tipo retornado Object. … } public static void mostrarDatos(Collection<?> datos) { … } } 15 TIPO COMODÍN.37)). 16 8 . 30. 22334. el uso del comodín es útil. con lo que no se puede verificar si el objeto que se quiere añadir es de una subclase de ?. mostrarDatos(p). p. Para garantizar que el método mostrarDatos aceptará como argumento un objeto de alguna de las clases derivadas de Persona. “Luis Pérez”.31/07/2010 TIPO COMODÍN. sin tener que realizar conversiones explícitas. Una colección genérica que utilice como argumento el tipo comodín. 28.21)). El tipo <?> se conoce como tipo comodín. 1532. “Ana López”. 5298.add(new Cliente(123. pero no permite añadir objetos a la misma porque ? representa un tipo desconocido. “Gerente”. public class PruebaHerenciaGenérica { public static void main(String args[]) { ArrayList<Persona> p = new ArrayList<Persona>(). p.add(new Empleado(234.

utilizando la sintaxis que se indica a continuación: public static void mostrarDatos ( ArrayList<? extends Persona> datos) { … } Ahora el método mostrarDatos acepta colecciones de cualquier subclase de Persona.31/07/2010 TIPO COMODÍN. Java permite limitar el tipo desconocido a los tipos definidos por estas subclases. 17 9 .

Sign up to vote on this title
UsefulNot useful