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



Documentos relacionados
Tema 5 Genericidad y Colecciones. Programación Orientada a Objetos Curso 2015/2016

1.2. Es Java un lenguaje ideal para aprender a programar? 1.4. Cuáles son las versiones y distribuciones Java y cuál usar?

Tema 3: Herencia en C# Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

Modulo 11. Clases y Objetos en Java

Tema 3 Herencia en Java Parte 1. Programación Orientada a Objetos Curso 2015/2016

Tema 3 Herencia en Java Parte 2. Programación Orientada a Objetos Curso 2015/2016

Introducción a la programación orientada a objetos

Clases Abstractas e Interfaces

Tema 7: Polimorfismo. Índice

Una Clase: define un grupo de objetos que tienen propiedades similares y se comportan de manera similar.

Examen Teórico Convocatoria de Junio de 2012

Práctica 2. Reutilización de código Elementos básicos del lenguaje Java Definición de variables, expresiones y asignaciones

Examen Teórico. Convocatoria de Febrero de 2015

Tema 6 Patrones de Diseño. Programación Orientada a Objetos Curso 2010/2011

Tema 3 Herencia en Java Parte 2. Programación Orientada a Objetos Curso 2015/2016

Tema 3. Programación orientada a objetos en Java (Parte 1)

Programación Orientada a Objetos. Sesión 4: Herencia

Forma Básica Clase Java

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Construcciones del Lenguaje Java

POO - Programación Orientada a Objetos

CLAVE ASIGNATURA REQUISITOS HORA/SEMANA CREDITOS TI-8 PROGRAMACION II 80% DE ASISTENCIA 4 6

Introducción a Java. Fernando Cerezal López. 24 Noviembre 2005

La sintaxis básica para definir una clase es la que a continuación se muestra:

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Tema 1. Herencia y Polimorfismo

Aspectos de los LP. Diseño de compiladores. Estático vs. Dinámico. Estático vs. Dinámico. Scope. Scope 24/03/2015

TEMA I PROGRAMACIÓN ORIENTADA A OBJETOS PROGRAMACIÓN N ORIENTADA A OBJETOS OBJETOS (I) OBJETOS (II)

Clases abstractas e interfaces en Java

CONTENIDOS. La herencia permite: - Adoptar automáticamente características ya implementadas. Ahorro de tiempo y esfuerzo

Definición. Mónica E. García García Feb 07

Declaración de variables (integer, single, double, boolean, etc.) en Visual Basic. Dim. Ejemplos. (CU00309A)

Apuntes de Programación y estructuras de datos. Tipos de datos

Tema 4 Genericidad. Programación Orientada a Objetos Curso 2010/2011

Guía práctica de estudio 08: Polimorfismo

PROGRAMACIÓN EN JAVA. { una línea para definir, crear o ejecutar ; }

Unidad Didáctica 3. Tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos

En este capitulo se estudiarán los conceptos relacionados a métodos, como lo son sobrecarga, métodos estáticos.

METODOS, SOBRECARGA Y CONSTRUCTORES

Interfaces. Amparo López Gaona. Septiembre de Amparo López Gaona () Interfaces Septiembre de / 1

A3F. Polimorfismo. Carlos Fontela

Examen Teórico. Convocatoria de Julio de 2015

PROGRAMACION ORIENTADA A OBJETOS EN C++

LA CLASE ARRAYLIST DEL API DE JAVA. MÉTODOS ADD, SIZE, ETC. CONCEPTO DE CLASE GENÉRICA O PARAMETRIZADA (CU00665B)

Programación orientada a objetos. Capítulo 8 Mejora de las estructuras mediante herencia

Estructuras de Datos Clase 1 - Introducción

Programación orientada a objetos

Unidad IV. Este tipo de codificación nos es permitido gracias a la sobrecarga, la cual se aplica a métodos y constructores.

Clase adicional 2. Estructuras básicas de control. Temas

Conceptos Básicos. Programación Orientada a Objetos 2

Categorías de métodos. Métodos constructores y destructores

Tema 5. Herencia. Departamento de Lenguajes y Sistemas Informáticos Universidad de Granada

Tema 2: Clase y objetos en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

Interface nominterface{

EJEMPLO DE CÓDIGO JAVA BÁSICO. CREAR CLASES CON CAMPOS, CONSTRUCTOR Y MÉTODOS. LA PALABRA CLAVE THIS (CU00652B)

PROGRAMACIÓN ORIENTADA A OBJETOS 10/02/2009. Examen de Java. Nombre: DNI: Titulación:

VARIABLES, CONSTANTES Y EXPRESIONES ASIGNACIÓN. TIPOS ELEMENTALES. PRECEDENCIA DE LOS ESTRUCTURAS DE CONTROL. CONDICIONAL E

Java. Introducción a la Programación Orientada a Objetos

Qué es Java? Un lenguaje de programación Un entorno de desarrollo Un entorno de aplicación Un entorno de despliegue Es similar en sintaxis de C + +.

Java Básico. Polimorfismo. Copyright

Identidad, igualdad y equivalencia

18. Interfaces Declaración de una interfaz

PROGRAMACIÓN GENÉRICA

Estructuras de control selectivas

Tipos Abstractos de Datos

RTTI y reflexión Modelos de datos

INTRODUCCION A LA PROGRAMACION EN JAVA

Programación Dirigida a Objetos. MATERIAL COMPLEMENTARIO Tema 5.- Herencia

Aplicaciones de Escritorio

Programación Digital I

Introducción a la Programación en Java

MOO - Metodología y Programación Orientada a Objetos

Compiladores e Intérpretes

Patrones de Diseño. Patrón estructural Composite. Técnicas de Programación - Curso 2007/08

LABORATORIO #7 PARTE I INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS

PROGRAMACIÓN EN JAVA

Herencia y Polimorfismo

PROGRAMACIÓN ORIENTADA A OBJETOS 1/7/2009. Examen de Java. Nombre: DNI: Titulación:

Tema: Clases y Objetos en C++. Parte II.

EJERCICIOS RESUELTOS. EJEMPLOS CON NÚMEROS ALEATORIOS EN JAVA. RANDOM NEXTINT, NEXTDOUBLE, ETC. (CU00909C)

Estructuras de control condicionales

6. Herencia. Clases abstractas. Genericidad. Clase Object Polimorfismo y ligadura dinámica super Herencia y creación Clases abstractas Genericidad

Transcripción:

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

Contenido Antecedentes. Genericidad en Java 5 y posterior. Características avanzadas: Genericidad restringida. Tipo puro. Limitaciones en tiempo de ejecución. Herencia. Curso 2013/2014 Programación Orientada a Objetos 2

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. Curso 2013/2014 Programación Orientada a Objetos 3

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. Curso 2013/2014 Programación Orientada a Objetos 4

Antecedentes public class Contenedor { private Object contenido; public void setcontenido(object contenido) { } this.contenido = contenido; public Object getcontenido() { } } return contenido; Curso 2013/2014 Programación Orientada a Objetos 5

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. Curso 2013/2014 Programación Orientada a Objetos 6

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. Curso 2013/2014 Programación Orientada a Objetos 7

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. Curso 2013/2014 Programación Orientada a Objetos 8

Clase genérica Contenedor public class Contenedor<T> { private T contenido; public void setcontenido(t contenido) { } this.contenido = contenido; public T getcontenido() { } } return contenido; Curso 2013/2014 Programación Orientada a Objetos 9

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 Curso 2013/2014 Programación Orientada a Objetos 10

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"); Curso 2013/2014 Programación Orientada a Objetos 11

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(); Curso 2013/2014 Programación Orientada a Objetos 12

Genericidad y sistema de tipos Deposito Contenedor<Deposito> No hay relación DepositoEstructurado Contenedor<DepositoEstructurado> Contenedor<Deposito> cdeposito; Contenedor<DepositoEstructurado> cestructurado; cdeposito = cestructurado; // No compila Curso 2013/2014 Programación Orientada a Objetos 13

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. Curso 2013/2014 Programación Orientada a Objetos 14

Genericidad y sistema de tipos Problema: el método sólo permite objetos de tipo List<Deposito>. public double posicionglobal(list<deposito> depositos) { double posicion = 0; for (Deposito deposito : depositos) { } } posicion += deposito.getcapital(); return posicion; Cómo podemos pasar una variable de tipo List<DepositoEstructurado>? Curso 2013/2014 Programación Orientada a Objetos 15

Genericidad y sistema de tipos Solución: tipo comodín. public double posicionglobal( List<? extends Deposito> depositos) 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. Curso 2013/2014 Programación Orientada a Objetos 16

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 = Curso 2013/2014 Programación Orientada a Objetos 17

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. Curso 2013/2014 Programación Orientada a Objetos 18

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). Curso 2013/2014 Programación Orientada a Objetos 19

Genericidad restringida 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. public class CarteraAhorro<T extends Deposito> { private LinkedList<T> contenido; } public void liquidar() { for (T deposito : contenido) deposito.liquidar(); } Curso 2013/2014 Programación Orientada a Objetos 20

Genericidad restringida Una clase genérica puede estar restringida por varios tipos: public class Contenedor<T extends Deposito & Amortizable> 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. Curso 2013/2014 Programación Orientada a Objetos 21

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. Contenedor contenedor = new Contenedor(); // Object CarteraAhorro cartera = new CarteraAhorro(); // Deposito Siendo: Clase Contenedor<T> Clase CarteraAhorro<T extends Deposito> Curso 2013/2014 Programación Orientada a Objetos 22

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) { } Curso 2013/2014 Programación Orientada a Objetos 23

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. public class CajaSeguridad<T> extends Contenedor<T> Restringir la genericidad. public class CajaSeguridad<T extends Valorable> extends Contenedor<T> No ser genérica y especificar un tipo concreto. public class CajaSeguridad extends Contenedor<Valorable> Curso 2013/2014 Programación Orientada a Objetos 24

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. Curso 2013/2014 Programación Orientada a Objetos 25