Tema 4 – Genericidad en Java -...

25
Tema 4 – Genericidad en Java Programación Orientada a Objetos Curso 2013/2014

Transcript of Tema 4 – Genericidad en Java -...

Page 1: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Tema 4 – Genericidad en Java

Programación Orientada a Objetos

Curso 2013/2014

Page 2: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 2

Contenido

� Antecedentes.

� Genericidad en Java 5 y posterior.

� Características avanzadas:

� Genericidad restringida.

� Tipo puro.

� Limitaciones en tiempo de ejecución.

� Herencia.

Page 3: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 3

Genericidad

� Facilidad de un lenguaje de programación para definir

clases parametrizadas con tipos de datos.

� Resultan de utilidad para la implementación de tipos de

datos contenedores como las colecciones.

� La genericidad sólo tiene sentido en lenguajes con

comprobación estática de tipos, como Java.

� La genericidad permite escribir código reutilizable.

Page 4: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 4

Antecedentes

� Motivación: aprovechar el tipo Object para definir

clases contenedoras (listas, conjuntos, diccionarios, etc.)

� Una referencia de tipo Object puede referenciar a

cualquier tipo de datos del lenguaje (objetos, tipos

primitivos).

� Ejemplo: definición de la clase Contenedor cuyo

propósito es ser el envoltorio de un valor de cualquier tipo

de datos.

Page 5: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 5

Antecedentes

public class Contenedor {

private Object contenido;

public void setContenido(Object contenido) {

this.contenido = contenido;

}

public Object getContenido() {

return contenido;

}

}

Page 6: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 6

Antecedentes

� Problema: el compilador no ayuda en el control de tipos.

� El uso correcto de los tipos queda en manos del

programador.

� Para extraer objetos es necesario hacer siempre un casting

que podría fallar.

Contenedor contenedor = new Contenedor ();

contenedor.setContenido("hola");

Deposito d = (Deposito) contenedor.getContenido();

// Error de casting en tiempo de ejecución.

Page 7: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 7

Antecedentes

� La técnica de genericidad basada en Object está en

desuso, aunque existe código que aún trabaja con este

tipo de genericidad.

� La genericidad en el lenguje Java fue introducida a partir

de la versión 5.

Page 8: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 8

Genericidad

� Una clase genérica es una clase que en su declaración

utiliza un tipo variable (parámetro), que será establecido

cuando sea utilizada.

� Al parámetro de la clase genérica se le proporciona un

nombre (T, K, V, etc.) que permite utilizarlo como tipo de

datos en el código de la clase.

� Sobre las variables cuyo tipo sea el parámetro (T, K, V, etc.)

sólo es posible aplicar métodos de la clase Object:

� � dado que representan “cualquier dato” sólo podemos aplicar

operaciones disponibles en todos los tipos de datos del

lenguaje Java.

Page 9: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 9

Clase genérica Contenedor

public class Contenedor<T> {

private T contenido;

public void setContenido(T contenido) {

this.contenido = contenido;

}

public T getContenido() {

return contenido;

}

}

Page 10: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 10

Operaciones sobre el tipo del parámetro (T)

� Las operaciones aplicables sobre cualquier objeto (métodos públicos de la clase Object)

� Podemos aplicar la asignación (=) y la comparación de identidad (== o !=).

� Dentro de la clase genérica, NO es posible construir objetos de los tipos parametrizados:

� T contenido = new T(); // No compila

Page 11: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 11

Uso de una clase genérica

� La parametrización de una clase genérica se realiza en la

declaración de una variable y en la construcción de

objetos.

Contenedor<String> contenedor =

new Contenedor<String>();

contenedor.setContenido("hola");

Page 12: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 12

Genericidad y tipos primitivos

� Las clases genéricas no pueden ser parametrizadas a

tipos primitivos.

� Para resolver este problema el lenguaje define clases

envoltorio de los tipos primitivos:

� Integer, Float, Double, Character, Boolean, etc.

� El compilador transforma automáticamente tipos primitivos

en clases envoltorio y viceversa: autoboxing.

Contenedor<Integer> contenedor =

new Contenedor<Integer>();

contenedor.setContenido(10);

int valor = contenedor.getContenido();

Page 13: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 13

Genericidad y sistema de tipos

Deposito

DepositoEstructurado

Contenedor<Deposito>

Contenedor<DepositoEstructurado>

No hay relación

Contenedor<Deposito> cDeposito;

Contenedor<DepositoEstructurado> cEstructurado;

cDeposito = cEstructurado; // No compila

Page 14: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 14

Genericidad y sistema de tipos

� Las reglas del polimorfismo se mantienen entre clases genéricas.

� Sin embargo, en una asignación polimórfica no estápermitido que tengan distintos parámetros.

� En el ejemplo, las dos variables son del mismo tipo (Contenedor), pero han sido parametrizadas a tipos distintos (Deposito y DepositoEstructurado).

� No importa que Deposito y DepositoEstructurado sean

tipos compatibles.

� Es una limitación en el paso de parámetros.

Page 15: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 15

Genericidad y sistema de tipos

� Problema: el método sólo permite objetos de tipo List<Deposito>.

� ¿Cómo podemos pasar una variable de tipo List<DepositoEstructurado>?

public double posicionGlobal(List<Deposito> depositos) {

double posicion = 0;

for (Deposito deposito : depositos) {

posicion += deposito.getCapital();

}

return posicion;

}

Page 16: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 16

Genericidad y sistema de tipos

� Solución: tipo comodín.

� En el ejemplo significa: permite cualquier lista genérica parametrizada a la clase Depósito o a un tipo compatible (subclase).

� El tipo comodín se puede usar también para declarar variables locales o atributos.

� No se puede utilizar para construir objetos.

� Si se indica simplemente <?>, significa “cualquier tipo”.

public double posicionGlobal(

List<? extends Deposito> depositos)

Page 17: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 17

Características avanzadas

� Una clase genérica puede tener varios

parámetros.

� Dentro de una clase genérica se pueden utilizar

otras clases genéricas.

� Una interfaz también puede declarar parámetros:

� Un ejemplo son las interfaces que definen las

colecciones: List<T>, Set<T>, Map<K, V>, etc.public class ContenedorDoble <T,K> {

private String nombre;

private Contenedor<T> clave;

private K valor; … }

ContenedorDoble<String, Cuenta> contenedor = …

Page 18: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 18

Características avanzadas

� Podemos aumentar las operaciones disponibles sobre las variables cuyo tipo sea un parámetro (T, K, V, etc.) con

genericidad restringida.

� Es posible utilizar una clase genérica y no establecer sus parámetros � se estable el tipo puro.

� En tiempo de ejecución no se puede consultar el parámetro al que fue instanciada una clase genérica.

� Se puede aplicar herencia con clases genéricas.

Page 19: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 19

Genericidad restringida

� Objetivo: limitar los tipos a los que puede ser

parametrizada una clase genérica.

� Al restringir los tipos obtenemos el beneficio de poder

aplicar métodos sobre los objetos del tipo

parametrizado.

� Una clase con genericidad restringida sólo permite ser

parametrizada con tipos compatibles con el de la

restricción (clase o interfaz).

Page 20: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 20

Genericidad restringida

public class CarteraAhorro<T extends Deposito> {

private LinkedList<T> contenido;

public void liquidar() {

for (T deposito : contenido)

deposito.liquidar();

}…

}

� Ejemplo: la clase CarteraAhorro sólo puede ser

parametrizada con tipos compatibles con Deposito.

� Sobre variables de tipo T podemos aplicar métodos

disponibles en la clase Deposito.

Page 21: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 21

Genericidad restringida

� Una clase genérica puede estar restringida por varios tipos:

� � Las operaciones disponibles para objetos de tipo T

son la unión de todos los tipos de la restricción.

� En el ejemplo, todas las operaciones de la clase Deposito

y la interfaz Amortizable.

public class Contenedor<T extends Deposito & Amortizable>

Page 22: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 22

Genericidad – Tipo puro

� Cuando se declara una variable cuyo tipo se corresponde

con una clase genérica y no se especifica el parámetro se

asigna el tipo puro (raw) que corresponde a:

� Sin genericidad restringida, la clase Object.

� Con genericidad restringida, la clase a la que se restringe.

� Siendo:

� Clase Contenedor<T>

� Clase CarteraAhorro<T extends Deposito>

Contenedor contenedor = new Contenedor(); // Object

CarteraAhorro cartera = new CarteraAhorro(); // Deposito

Page 23: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 23

Genericidad – Tiempo de ejecución

� En tiempo de ejecución se pierde la información sobre el

tipo utilizado para parametrizar la clase genérica.

� Con el operador instanceof sólo podemos preguntar por

el nombre de la clase.

// No compila

if (contenedor instanceof Contenedor<Deposito>) { … }

// Sí compila

if (contenedor instanceof Contenedor) { … }

Page 24: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 24

Genericidad y herencia

� Una clase puede heredar de una clase genérica.

� La nueva clase tiene las opciones:

� Mantener la genericidad de la clase padre.

� Restringir la genericidad.

� No ser genérica y especificar un tipo concreto.

public class CajaSeguridad<T> extends Contenedor<T>

public class CajaSeguridad<T extends Valorable>

extends Contenedor<T>

public class CajaSeguridad extends Contenedor<Valorable>

Page 25: Tema 4 – Genericidad en Java - dis.um.esdis.um.es/docencia/poo/wiki/lib/exe/fetch.php?media=curso2013:tema... · Curso 2013/2014 Programación Orientada a Objetos 3 Genericidad

Curso 2013/2014 Programación Orientada a Objetos 25

Seminario 3

� El Seminario 3 trata la genericidad en Java e

incluye los siguientes ejemplos:

� Genericidad basada en Object.

� Definición de una clase genérica.

� Genericidad restringida.