La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

1 Genéricos en Java Jaime Ramírez, Ángel Lucas González DLSIIS. Facultad de Informática Universidad Politécnica de Madrid.

Presentaciones similares


Presentación del tema: "1 Genéricos en Java Jaime Ramírez, Ángel Lucas González DLSIIS. Facultad de Informática Universidad Politécnica de Madrid."— Transcripción de la presentación:

1 1 Genéricos en Java Jaime Ramírez, Ángel Lucas González DLSIIS. Facultad de Informática Universidad Politécnica de Madrid.

2 2 Introducción Java permite definir clases con variables o parámetros que representan tipos => Clases genéricas Esto es posible, cuando el tipo de un dato no afecta al tratamiento que se le va a dar a ese dato. Un mecanismo similar está disponible en lenguajes como C#, C++ o Ada.

3 3 Introducción Aparecen en la versión 1.5. Antes se utilizaba la clase Object como comodín para simular los genéricos, pero esto conllevaba: –Se podían mezclar objetos de las clases más dispares en una misma estructura contenedora de objects. –Había que realizar muy a menudo castings (conversión de Object a cualquier otra clase).

4 4 Motivación Supongamos que en un programa necesitamos una clase ParEnteros: public class ParEnteros { private int a, b; public ParEnteros(int a, int b){ this.a = a; this.b = b; } public ParEnteros swap (){ return new ParEnteros(b, a); }

5 5 Motivación Pero también necesitamos un clase ParCaracteres con los mismos métodos que la anterior. La implementación de los métodos es la misma, porque no depende del tipo del dato manipulado => abstraemos el tipo convirtiéndolo en un parámetro genérico T.

6 6 Ejemplo clase genérica Par public class Par { private T a, b; public Par(T a, T b){ this.a = a; this.b = b; } public Par swap (){ return new Par (b, a); }

7 7 Ejemplo clase genérica Par public class Prueba { public static void main(String[] args) { // Instanciación de la clase genérica para Integer // No se puede usar int porque no es una clase Par p = new Par (1,2); // Instanciación de la clase genérica para Character Par p1 = new Par ('a','b'); p = p.swap(); p1 = p1.swap(); }

8 8 Restringiendo el parámetro genérico Supongamos que deseamos añadir a la clase Par un método max(): public T max(){ return ((a>b) ? a : b); } Si añadimos este método sin más, obtendremos un error de compilación, ya que a y b no tienen por qué ser de un tipo comparable con >.

9 9 Restringiendo el parámetro genérico Debemos decirle al compilador que el tipo T sólo representará tipos de valores comparables con el > o una función equivalente (compareTo). public class Par { private T a, b; public Par(T a, T b){ this.a = a; this.b = b; } public T max(){ return ((a.compareTo(b)>0) ? a : b); }

10 10 Restringiendo el parámetro genérico En general, se puede declarar un parámetro genérico de forma que al instanciar la clase se debe proporcionar una clase A que sea subclase de otra B o implemente una cierta interfaz B: class ClaseGen { } ClaseGen obj; // instanciación

11 11 Restringiendo el parámetro genérico class Stats { private T[] nums; Stats(T[] o) { nums = o; } double average() { double sum = 0.0; for(int i=0; i < nums.length; i++) sum += nums[i].doubleValue(); return sum / nums.length; } }

12 12 Restringiendo el parámetro genérico public class BoundsDemo { public static void main(String args[]) { Integer inums[] = { 1, 2, 3, 4, 5 }; Stats iob = new Stats (inums); double v = iob.average(); System.out.println("iob average is " + v); Double dnums[] = { 1.1, 2.2, 3.3, 4.4, 5.5 }; Stats dob = new Stats (dnums); double w = dob.average(); System.out.println("dob average is " + w); // Esto no compila porque String no es // subclase de Number // String strs[] = { "1", "2", "3", "4", "5" }; // Stats strob = // new Stats (strs); // double x = strob.average(); // System.out.println("strob average is "+v ); }

13 13 Clases genéricas como parámetros de funciones boolean sameAvg(Stats ob) { if(average() == ob.average()) return true; else return false; } Por medio del tipo Stats indicamos que esta función puede recibir un objeto de cualquier instancia de la clase genérica Stats

14 14 Clases genéricas como parámetros de funciones Integer inums[] = { 1, 2, 3, 4, 5 }; Stats iob = new Stats (inums); double v = iob.average(); System.out.println("iob average is " + v); Double dnums[] = { 1.1, 2.2, 3.3, 4.4, 5.5 }; Stats dob = new Stats (dnums); double w = dob.average(); System.out.println("dob average is " + w); System.out.print("Averages of iob and dob "); if(iob.sameAvg(dob)) System.out.println("are the same."); else System.out.println("differ.");

15 15 Herencia y genéricos Véase el ejemplo de los apuntes de la asignatura (pags 75-79): Implementación de una clase genérica Cola.


Descargar ppt "1 Genéricos en Java Jaime Ramírez, Ángel Lucas González DLSIIS. Facultad de Informática Universidad Politécnica de Madrid."

Presentaciones similares


Anuncios Google