You are on page 1of 9

31/07/2010

Genéricos en Java

Curso: Tecnología de la Programación II.


Docente: Mg. Zoraida Vidal Melgarejo,.

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.

1
31/07/2010

CLASES GENÉRICAS.

Los ejemplos mostrados a continuación definen listas de


diferentes tipos utilizando la clase genérica ArrayList:
 ArrayList<Integer> numeros = new ArrayList<Integer>();
 ArrayList<String> nombres = new ArrayList<String>();
 ArrayList<Persona> personas = new ArrayList<Persona>();

La primera declaración, de la variable numeros, define una lista


de enteros, que es lo que especifica el parámetro Integer, la
segunda define una lista de cadenas de caracteres, 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.

CLASES GENÉRICAS.

Una programación que utiliza tipos como parámetros recibe el


nombre de programación genérica.

La biblioteca estándar de Java presenta muchas de sus


abstracciones como clases genéricas; por ejemplo, ArrayList,
HashMap y TreeMap.

2
31/07/2010

DEFINICIÓN DE CLASES GENÉRICAS.

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, entre los


signos < y >, la lista de parámetros de tipo separados por
comas. Por ejemplo:
public class MiClase<T1, T2> { … }

Los parámetros de la lista serán utilizados para implementar los


métodos de la clase, bien como parámetros del método o
como tipo del valor retornado.
5

DEFINICIÓN DE CLASES GENÉRICAS.

public class MiLista<T> {


private ArrayList<T> lista;
public MiLista() {
lista = new ArrayList<T>();
}
public void setElemento(T valor) {
lista.add(valor);
}
public T getElemento(int i) {
return lista.get(i);
}
}
6

3
31/07/2010

DEFINICIÓN DE CLASES GENÉRICAS.

public class PruebaListaNumeros {

public static void main(String [] args) {


MiLista<Double> listaNumeros;
listaNumeros = new MiLista<Double>();
listaNumeros.setElemento(5.0);
// No hay necesidad de realizar una conversión explícita
// del objeto recuperado de la colección
double numero = listaNumeros.getElemento(0);
System.out.println(numero);
}
}
7

DEFINICIÓN DE CLASES GENÉRICAS.

public class PruebaListaCadenas {

public static void main(String [] args) {


MiLista<String> listaNombres;
listaNombres = new MiLista<String>();
listaNombres.setElemento(“Adriana”);
// No hay necesidad de realizar una conversión explícita
// del objeto recuperado de la colección
String nombre = listaNombres.getElemento(0);
System.out.println(nombre);
}
}
8

4
31/07/2010

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 código fuente, ni


en binario, ni en el disco, ni en memoria. Simplemente sustituye
T por Object y añade el código necesario para seguir
proporcionando la característica de autoempaquetado /
desempaquetado (autoboxing / unboxing), así como las
conversiones explícitas necesarias; esto es, si estamos
trabajando con una lista de objetos Persona, en algún punto los
Object deben ser convertidos a Persona.

DEFINICIÓN DE CLASES GENÉRICAS.

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, y porque el tipo del objeto
recuperado de la colección es conocido, por lo tanto no hay
necesidad de hacer una conversión explícita.

10

5
31/07/2010

RELACIÓN ENTRE CLASES GENÉRICAS.

En general, si ClaseB es una subclase de ClaseA, y ClaseG es


una clase genérica, la clase ClaseG<ClaseB> no es una subclase
de ClaseG<ClaseA>.

Por ejemplo, el siguiente código:


MiLista<Integer> lista3 = new MiLista<Integer>();
MiLista<Object> lista4 = lista3;

No es válido, ya que lista3 no es un objeto de una subclase de


MiLista<Object>. El compilador Java lo notificará con un
mensaje de error.

11

TIPO COMODÍN.

Consideremos la siguiente relación de herencia entre clases:

12

6
31/07/2010

TIPO COMODÍN.

public class PruebaHerenciaGenérica {


public static void main(String args[]) {
ArrayList<Persona> p = new ArrayList<Persona>();
p.add(new Cliente(123, “Luis Pérez”, 30, 22334, 1532.37));
p.add(new Empleado(234, “Ana López”, 28, “Gerente”, 5298.21));
mostrarDatos(p);
Error!! Porque la clase de p,
… ArrayList<Persona> no es una
subclase de Collection<Object>
}
public static void mostrarDatos(Collection<Object> datos) {

}
}
13

TIPO COMODÍN.

Entonces, si se desea que los tipos derivados sean aceptados en


la lista genérica, ¿cuál es la superclase de todas las colecciones?

Es una colección en la que el tipo de los elementos no sea


conocido. Se escribe así:
Collection<?>

El código mostrado anteriormente, se modificaría de la


siguiente manera:

14

7
31/07/2010

TIPO COMODÍN.

public class PruebaHerenciaGenérica {


public static void main(String args[]) {
ArrayList<Persona> p = new ArrayList<Persona>();
p.add(new Cliente(123, “Luis Pérez”, 30, 22334, 1532.37));
p.add(new Empleado(234, “Ana López”, 28, “Gerente”, 5298.21));
mostrarDatos(p);

}
public static void mostrarDatos(Collection<?> datos) {

}
}
15

TIPO COMODÍN.

El tipo <?> se conoce como tipo comodín. Una colección


genérica que utilice como argumento el tipo comodín, siempre
permite extraer objetos, porque garantiza como tipo
retornado Object, pero no permite añadir objetos a la misma
porque ? representa un tipo desconocido, con lo que no se
puede verificar si el objeto que se quiere añadir es de una
subclase de ?.

Para garantizar que el método mostrarDatos aceptará como


argumento un objeto de alguna de las clases derivadas de
Persona, sin tener que realizar conversiones explícitas, el uso
del comodín es útil.
16

8
31/07/2010

TIPO COMODÍN.

Java permite limitar el tipo desconocido a los tipos definidos


por estas subclases, 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.

17

You might also like