La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Genéricos en Java Jaime Ramírez, Ángel Lucas González

Presentaciones similares


Presentación del tema: "Genéricos en Java Jaime Ramírez, Ángel Lucas González"— Transcripción de la presentación:

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

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 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 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 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 Ejemplo clase genérica Par
public class Par<T> { private T a, b; public Par(T a, T b){ this.a = a; this.b = b; } public Par<T> swap (){ return new Par<T>(b, a);

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<Integer> p = new Par<Integer>(1,2); // Instanciación de la clase genérica para Character Par<Character> p1 = new Par<Character>('a','b'); p = p.swap(); p1 = p1.swap(); }

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 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<T extends Comparable> { 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 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<T extends B>{ } ClaseGen<A> obj; // instanciación

11 Restringiendo el parámetro genérico
class Stats< T extends Number > {     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 Restringiendo el parámetro genérico
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<String> strob =  // new Stats<String>(strs);    // double x = strob.average();  // System.out.println("strob average is "+v); }   } public class BoundsDemo {  public static void main(String args[]) {   Integer inums[] = { 1, 2, 3, 4, 5 };  Stats<Integer> iob =  new Stats<Integer>(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<Double> dob = new Stats<Double>(dnums);     

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<T extends Number>

14 Clases genéricas como parámetros de funciones
Integer inums[] = { 1, 2, 3, 4, 5 };       Stats<Integer> iob = new Stats<Integer>(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<Double> dob = new Stats<Double>(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 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 "Genéricos en Java Jaime Ramírez, Ángel Lucas González"

Presentaciones similares


Anuncios Google