Está en la página 1de 6

Tema 3: Genericidad en Java

Índice general:
Tema 3: Genericidad en Java 1. Definición y Ventajas de la Programación Genérica.
2. Clases Genéricas:
1. Definición y Uso.
2. Clases Genéricas Estándar: La Clase ArrayList
3. Restricción de Tipos Genéricos.
Germán Moltó
3. Métodos Genéricos:
Escuela Técnica Superior de Ingeniería Informática 1. Definición y Uso
Universidad Politécnica de Valencia 2. El Problema de la Ordenación.
3. El Interfaz Comparable.

1 2

Objetivos y Bibliografía Modelos de Datos Genéricos


 Entender la Programación Genérica como mecanismo para la  Objetivo: Independizar el proceso del tipo de datos
reutilización de software. sobre los que se aplica.
 Estudio de la sintaxis y la terminología necesaria para utilizar la public class Caja {
genericidad en Java. private Integer dato;
public Caja() { super();}
public Integer quita() {return dato;}
 Bibliografía:
public void pon(Integer d){dato = d;}
 Tutorial “Learning the Java Lenguage. Generics” disponible
} public class TestCaja {
en Inglés en la siguiente dirección:
public static void main(String args[]){
http://java.sun.com/docs/books/tutorial/java/generics/
Caja c = new Caja();
c.pon(new Integer(46));
Integer x = c.quita();
}}
3 4
Modelos de Datos Genéricos (II) Genericidad en Java (I)
 Es posible generalizar la Caja para que permita trabajar  A partir de la versión 1.5, Java introduce mecanismos
con cualquier tipo de datos. explícitos para gestionar la genericidad.
public class Caja { public class Caja <T> { • Permite la comprobación
private Object dato; private T dato; de tipos correctos en
public Caja() { super();} public Caja() { super();} tiempo de compilación.
public Object quita() {return dato;} public T quita() {return dato;}
public void pon(Object d){dato = d;} public void pon(T d){dato = d;}
} public class TestCaja { } public class TestCaja {
public static void main(String args[]){ • Declaración explícita del public static void main(String args[]){
• La utilización de diversos tipos de
datos únicamente puede detectarse Caja c = new Caja(); tipo de datos a utilizar. Caja<Integer> caja = new Caja<Integer>();
en tiempo de ejecución. c.pon(new Manzana()); caja.pon(new Integer(46));
• No es necesario el
• Requiere un Casting tras obtener el Manzana x = (Manzana) caja.quita(); casting tras obtener el Integer x = caja.quita(); }
valor de la caja. }} }
valor.
5 6

Genericidad en Java (II) La Interfaz Genérica Estándar: List<E>


 El uso de los mecanismos de Genericidad de Java 1.5:  La interfaz List<E> permite definir una colección de
 Permite la detección de errores de tipos en tiempo de elementos:
compilación y evita algunos errores de ejecución.  El usuario controla en qué punto de la lista se realizan las
 Evita realizar castings tras obtener el dato genérico. inserciones (por defecto se añaden al final).
public class TestCaja  Puede contener elementos duplicados.
{ ¿Qué es mejor, un error en
tiempo de compilación o
public static void main(String args[]){ en tiempo de ejecución? List<E>
Caja <Integer> caja = new Caja<Integer>();
caja.pon(“46”);
Integer x = caja.quita();
}} ArrayList<E> LinkedList<E> Vector<E> …
• Mensaje del compilador “pon(java.lang.Integer) in
Caja<java.lang.Integer> cannot be applied to (java.lang.String).
7 8
La Clase Genérica Estándar ArrayList Restricción de Tipos Genéricos
 La Clase ArrayList<E>  Es posible restringir el tipo genérico para trabajar con un
 Define un grupo de objetos de tipo E a los que se accede a tipo específico (y sus subtipos).
partir del índice.
public class CajaNumeros <T extends Number>
 Permite el crecimiento dinámico de la estructura de datos. {
public class TestArrayList{ private T dato;
public static void main(String args[]){ public T quita(){return dato;}
List<Figura> lista = new ArrayList<Figura>(); public void pon(T dato){this.dato = dato;}
lista.add(new Circulo()); }
Figura f = lista.get(0);
CajaNumeros<Double> caja = new CajaNumeros<Double>(); //OK
Circulo c = (Circulo) lista.get(0);
}} CajaNumeros<String> caja2 = new CajaNumeros<String>(); //ERROR

• El método get puede lanzar IndexOutOfBoundsException (RuntimeException) • Error del compilador: “type parameter java.lang.String is not within
its bound”
9 10

Instanciando la Genericidad en una


Métodos Genéricos Subclase
 Al igual que se definen clases genéricas, es posible definir  Es posible particularizar una clase genérica en una
métodos genéricos (incluso en clases no genéricas). subclase para que utilice un tipo de datos determinado:
public class Caja <T> public class Caja <T> { public class Manzana {
{ protected T dato; private int sabor;
private T dato; public Caja() { super();} public Manzana(int sabor){
public T quita(){return dato;} public T quita() {return dato;} this.sabor = sabor;}
public void pon(T dato){this.dato = dato;} public void pon(T d){dato = d;} public int getSabor(){return sabor;}
public static <U> void ponEnCaja(U u, Caja<U> caja){ } }
caja.pon(u);
} public class CajaManzanas extends Caja<Manzana>
• La clase
} {
CajaManzanas deja
public int getSabor(){return dato.getSabor();}
Caja<Integer> caja = new Caja<Integer>(); de ser genérica.
Caja.ponEnCaja(new Integer(52), caja); }
11 12
Programación Genérica a Partir de la
Genericidad con Más de Una Variable Herencia
 Una clase genérica (o un método) puede referencias más  Reutilizar código requiere:
de una variable genérica.  Independizar un algoritmo del tipo de datos sobre el que se
 Ejemplo: aplica, i.e. realizar una Programación Genérica.
 La interfaz Map<K,V> del API de Java  Ejemplo: Problema de la Ordenación de un array de
 public interface Map<K,V>{ … } elementos
 Permite establecer una correspondencia entre objetos de un  Diversos algoritmos de ordenación:
tipo (denominados claves) y de otro (denominados valores)  Inserción directa
 Ambos tipos pueden coincidir.  Selección directa
 Ejemplo de instanciación:  Intercambio directo
 Map<Integer, String> m = new SortedMap<Integer, String>();  Se debe conocer el tipo base del array si es primitivo, como
 m.put(new Integer(5), “casa”); int, u objeto como Figura o Integer.
 String s = m.get(new Integer(5));
13 14

Inserción Directa: Dos Métodos Según Herramientas para Programación


el Tipo Genérica
// Ordenación del array int a[]  ¿Qué haría falta para desarrollar un método genérico?
for( int i = 1; i < a.length ; i++ ) {
 Un tipo o clase genérica compatible con el de los elementos a
int elemAInsertar = a[i];
ordenar.
int posIns = i ;
 Un tipo o clase genérica con un único método abstracto que
for(; posIns>0 && elemAInsertar < a[posIns-1]; posIns--) a[posIns]=a[posIns-1];
permita comparar objetos compatibles entre sí:
a[posIns] = elemAInsertar;
 La interfaz Comparable<T>, cuyo único método es:
}
int compareTo(T o)
// Ordenación del array Figura a[]
for( int i = 1; i < a.length ; i++ ) {
Figura elemAInsertar = a[i];  El método int compareTo(T o):
int posIns = i ;  Devuelve < 0 si este objeto es menor que el objeto o.
for(; posIns>0 && elemAInsertar.area() < a[posIns-1].area(); posIns--)  Devuelve = 0 si este objeto es igual que el objeto o.
a[posIns]=a[posIns-1];  Devuelve > 0 si este objeto es mayor que el objeto o.
a[posIns] = elemAInsertar; }
15 16
Método Genérico de Inserción Directa Uso de insercionDirecta
 Un código genérico de ordenación requiere:  Uso del método estático insercionDirecta en la clase
 Restringir el tipo de datos de los elementos del vector a aquellos que sean
comparables.
Ordenacion del paquete ordenacionArray:
 La clase de los elementos del vector debe implementar la interfaz import ordenacionArray.*;
Comparable<T>. public class TestOrdenacionInteger {
public static void main(String args[]){
public static <T extends Comparable<T>> void insercionDirecta( T a[] ) Integer a[] = new Integer[4];
for( int i = 1; i < a.length ; i++ ) { .... //Rellenar el vector a
T elemAInsertar = a[i]; Ordenacion.insercionDirecta(a);
int posIns = i ; .... //El vector a está ordenado
for(; posIns>0 && elemAInsertar.compareTo(a[posIns-1]) < 0; posIns--) { }
a[posIns]=a[posIns-1]; }
} 1. Importar el paquete que contiene la clase Ordenacion.
a[posIns] = elemAInsertar; 2. Invocar al método genérico, tras inicializar el array.
}} 3. La clase base (o tipo) del array debe implementar el interfaz
Comparable<T>, proporcionando código al método compareTo.
17 18

Implementación de la Interfaz
Comparable Ejercicio: ¿Qué líneas producen error?
 int compareTo(T o): 1. Figura f1 = new Circulo();
 Devuelve < 0 si este objeto es menor que el objeto o. 2. Figura f2 = new Cuadrado();
 Devuelve = 0 si este objeto es igual que el objeto o. 3. System.out.println(f1.compareTo(f2));
 Devuelve > 0 si este objeto es mayor que el objeto o.
4. Object x = f1;
public abstract class Figura implements Comparable<Figura> {
...
5. System.out.println(x.compareTo(f1));
public int compareTo(Figura o){ 6. System.out.println( (Comparable) x.compareTo(f1));
double areaf = o.area();
double areathis = this.area();
7. System.out.println( ((Comparable) x).compareTo(f1));
if ( areathis < areaf ) return -1; 8. System.out.println( f2.compareTo(x) );
else if ( areathis > areaf ) return 1;
else return 0;
}
}
19 20
Ejercicios Propuestos de Programación
Los métodos equals y compareTo Genérica
 Se recomienda que las definiciones de equals y  Ejercicio 1. Diseñar la Clase Genérica Operaciones, en el
compareTo sean compatibles: paquete ordenacionArray del proyecto Bluej util de librerias,
 (x.compareTo(y) == 0 )  x.equals(y) con la siguiente funcionalidad:
public int compareTo(Figura o){  Calcular el elemento mínimo de un array;
double areaF = o.area(), area = this.area();  Calcular el elemento máximo de un array;
if ( area < areaF ) return -1;
else
 Buscar un Objeto en un array, devolviendo la posición de la
if (tipo.equals(f.tipo) && color.equals(f.color) && area==areaF) return 0; primera aparición del Objeto en el array o -1 si no existe.
else return 1;  Además, diséñese una aplicación que use la Clase Operaciones
} para un array de Integer
 Ejercicio 2. Añádase a la clase Operaciones un método
public boolean equals(Object x){ genérico que borre la primera aparición en el array de un
return ( this.compareTo( (Figura) x) == 0 ) ;
} objeto dado, devolviendo el objeto eliminado del array o
null si no se encuentra.
21 22

También podría gustarte