Diapositivas de U-tad Centro Universitario de Tecnología y Arte Digital sobre programación genérica en Java. El Pdf explora la programación orientada a objetos, la limitación de tipos y ejemplos de código, útil para estudiantes universitarios de Informática.
Ver más20 páginas


Visualiza gratis el PDF completo
Regístrate para acceder al documento completo y transformarlo con la IA.
U -Tad CENTRO UNIVERSITARIO DE TECNOLOGÍA Y ARTE DIGITAL Tema 8. Programación genérica en Java Programación Orientada a Objetos Miguel Ángel Mesas Uzal 2022-2023U -Tad CENTRO UNIVERSITARIO DE TECNOLOGÍA Y ARTE DIGITAL Programación Genérica 2 Introducción ¿Qué tal programar, por ejemplo, un método una vez y luego poder usar con argumentos de diferente tipo?U -Tad CENTRO UNIVERSITARIO DE TECNOLOGÍA Y ARTE DIGITAL Programación Genérica 3 Introducción . Para esto, podemos emplear tipos genéricos o parametrizados! · Permiten crear clases, interfaces y métodos en los que el tipo de datos se especifica como parámetro. · El código genérico trabaja automáticamente con el tipo de datos pasado a su parámetro de tipo. · Puedo definir el algoritmo una vez, y aplicarlo a una gran variedad de datos.U
-Tad CENTRO UNIVERSITARIO DE TECNOLOGÍA Y ARTE DIGITAL Programación Genérica 4 ¿Y como se hace eso? · Declaración: class nombre-clase { ... } · Declaración y creación de una instancia: Nombre-clase nombre-var = new nombre-clase(lista-arg-cons);U
-Tad CENTRO UNIVERSITARIO DE TECNOLOGÍA Y ARTE DIGITAL Programación Genérica 5 Creación de una clase genérica class Gen{ //T es el parámetro de tipo genérico. T ob; //En esta clase, vamos a tener, por ejemplo, un atributo de tipo T Gen(T o){ //el constructor ob=0; } T getOb(){ //el get return ob; } void mostrarTipo(){ //metodo que me devuelve el tipo del atributo System. out.println("El tipo de T es: "+ob. getClass ( ) . getName() ); } }U
-Tad CENTRO UNIVERSITARIO DE TECNOLOGÍA Y ARTE DIGITAL Programación Genérica 6 Uso de la clase genérica class Genericos { public static void main(String[] args) { Gen i0b;//Crea una referencia Gen para Integers. //uso de autoboxing para encapsular el valor 28 dentro de un objeto Integer. i0b=new Gen(28); //Creamos un objeto Gen, lo asignamos a i0b e inicializamos a 28. i0b.mostrarTipo(); //Muestramos el tipo de dato. int v=10b.get0b();//Obtenemos el valor en i0b. System.out.println("Valor: "+v); //lo printamos //Creamos otro objeto Gen para Strings !!. Gen strOb=new Gen("Prueba de genéricos") ; strOb.mostrarTipo(); //Muestramos el yipo String str=str0b.get0b(); //obtenemos el valor System. out.println("Valor: "+str); //lo printamos }U
-Tad CENTRO UNIVERSITARIO DE TECNOLOGÍA Y ARTE DIGITAL Programación Genérica 7 Introducción Los genéricos funcionan sólo con tipos referencia: ▪ Gen intOb = new Gen(28); // Error, no puede usar el tipo primitivo . En Java existen clases llamadas Wrappers, que nos permiten trabajar con tipos mprimitivos como si fuesen objetos. (p.e. Integer, Double ... ). ▪ Los tipos genéricos difieren segun sus argumentos de tipo: · En el ejemplo anterior: iOb = strOb; // Error! · En el ejemplo, ambos son de tipo Gen, pero están referenciando tipos específicos diferentes (Integer y String). · Esto añade seguridad cuando programamos de forma genérica.U
-Tad CENTRO UNIVERSITARIO DE TECNOLOGÍA Y ARTE DIGITAL Programación Genérica 8 Genérica con dos tipos class DosGen{ / /dos atributos de tipo T ob1; //un objeto de tipo T V ob2; //un objeto de tipo V DosGen(T o1, V 02){//constructor ob1=01; ob2=02; } T get0b1(){ //get de T return ob1; } V get0b2(){ //get de V return ob2; void mostrarTipo(){ //Muestra el tipo de Ty V System. out.println("El tipo de T es: "+ob1. getClass( ) . getName ( )) ; System. out.println("El tipo de V es: "+ob2. getClass( ) .getName ( ) ) ; }U
-Tad CENTRO UNIVERSITARIO DE TECNOLOGÍA Y ARTE DIGITAL Programación Genérica 9 Limitación de tipos · A veces es útil limitar los tipos que se pueden pasar a un parámetro de tipo. · Por ejemplo, una clase que hace cálculos numéricos no debería poder recibir como parámetro de tipo una String. ▪ Con tipos limitados se puede indicar la superclase de la que deben heredar todos los argumentos de tipo (p.e. Number): 10 Programación Genérica U
-Tad CENTRO UNIVERSITARIO DE TECNOLOGÍA Y ARTE DIGITAL Limitación de tipos class OperaMate { // En este caso, el argumento de tipo / / debe ser Number o una subclase en Number. T num; OperaMate( Tn){ num=n; } / /Devuelve el recíproco double reciproco () { return 1/num. doubleValue(); } //Devuelve parte fraccionaria double fraccion ( ) { return num. doubleValue ( )-num. intValue(); } }U
-Tad CENTRO UNIVERSITARIO DE TECNOLOGÍA Y ARTE DIGITAL Programación Genérica 11 Limitación de tipos class DemoTipoLimite{ public static void main(String[] args) { OperaMate 10b = new OperaMate(5); System.out.println("El recíproco de 5 es: "+10b. reciproco() ); System.out.println("La parte fraccionaria de 5 es: "+10b. fraccion () ) ; System. out.println(); OperaMate dob = new OperaMate(15.25) ; System.out.println("El recíproco de 15.25 es: "+d0b. reciproco()); System.out.println("La parte fraccionaria de 15.25 es : "+dOb. fraccion( ) ) ; // Esto no se compilará / / porque String no es una subclase de Number. OperaMate str0b = new OperaMate('Error"); Exception in thread "main" java. lang. Error: Unresolved compilation problem: Invalid character constant at DemoTipoLimite. main (DemoTipoLimite. java: 14)U
-Tad CENTRO UNIVERSITARIO DE TECNOLOGÍA Y ARTE DIGITAL Programación Genérica 12 Introducción · Los tipos limitados son especialmente útiles cuando deseamos asegurarnos de que un parámetro de tipo sea compatible con otro. class Pareja{ / /Aquí, V debe ser algún tipo como T o una subclase de T T primero; V segundo; Pareja(T a, V b) { primero=a; segundo=b; } · Esto está bien porque Integer es una subclase de Number. Pareja y = new Pareja(10.4, 12); · Esto causa un error porque String no es una subclase de Number Pareja z = new Pareja(10.4, "12");U
-Tad CENTRO UNIVERSITARIO DE TECNOLOGÍA Y ARTE DIGITAL Programación Genérica 13 Métodos genéricos public class Metodo { public static void imprimirGenerico (D dato) { System.out. println(dato); } public static void main(String[] args) { Integer i = new Integer (10); imprimirGenerico(i); Float f = new Float (20.33f) ; imprimirGenerico(f); } Antes de Java 7, en la invocación a un metodo generico era necesario el tipo: objeto .< Integer>imprimirGenerico(i)14 Programación Genérica U
-Tad CENTRO UNIVERSITARIO DE TECNOLOGÍA Y ARTE DIGITAL Ejemplo: añadir elemento a un array genérico public static boolean addElemento (D[] datos, D dato) { boolean resultado = false; if (dato != null) { for (int cont=0; cont
-Tad CENTRO UNIVERSITARIO DE TECNOLOGÍA Y ARTE DIGITAL Ejemplo: mayor entre arrays public static boolean getMayor (T[] t,U[] u){ return ( (t. length > u. length) ) ; } public static void main(String[] arg) { Integer[] enteros = {1,2,3,4}; String [] cadena = {"Uno", "Dos"}; boolean resultado = getMayor(enteros, cadena) ; if (resultado) { System. out.println("El array de enteros es mayor") ; } else{ System. out. println("El array de cadenas es mayor") ; } }U
-Tad CENTRO UNIVERSITARIO DE TECNOLOGÍA Y ARTE DIGITAL Programación Genérica 16 ArrayList " La clase ArrayList nos permite trabajar con arrays de tamaño variable !! · Se puede encontrar en el paquete java.util.ArrayList · La sintaxis es: ArrayList matriz = new ArrayList();U
-Tad CENTRO UNIVERSITARIO DE TECNOLOGÍA Y ARTE DIGITAL Programación Genérica 17 ArrayList import java. util. ArrayList; public class Main { public static void main(String[] args) { ArrayList matriz = new ArrayList(); matriz. add ("hola") ; matriz. add ("mundo") ; String extraido = matriz. get(0); matriz. set(0, "he cambiado este string"); for (int i = 0; i < matriz.size(); i++) { System.out.println(matriz.get(i)); } matriz. remove (0); System.out.println(matriz); matriz.clear();18 Programación Genérica U
-Tad CENTRO UNIVERSITARIO DE TECNOLOGÍA Y ARTE DIGITAL LinkedLists La clase LinkedList hace "lo mismo" que la ArrayList. . Tiene todos los mismos metodos que la clase ArrayList porque ambos implementan la interfaz List. . Se pueden agregar elementos, cambiar elementos, eliminar elementos y borrar la lista ... · Diferencia: " La clase ArrayList tiene una matriz regular dentro de ella. Cuando se agrega un elemento, se coloca en la matriz. Si la matriz no es lo suficientemente grande, se crea una nueva matriz más grande para reemplazar la anterior y se elimina la anterior. · LinkedList almacena sus elementos en "contenedores". La lista tiene un enlace al primer contenedor y cada contenedor tiene un enlace al siguiente contenedor de la lista.U
-Tad CENTRO UNIVERSITARIO DE TECNOLOGÍA Y ARTE DIGITAL Introducción a la programación orientada a objetos 19 LinkedLists · Métodos específicos de LinkedLists: isEmpty() true si la lista está vacía. addFirst() añade un item al principio. addLast() añade un item al final. removeFirst() borra el primer item. removeLast() borra el ultimo item. getFirst() coge el item al principio. getLast() coge el item al final. toString() hace un String del contenido.20 Programación Genérica U
-Tad CENTRO UNIVERSITARIO DE TECNOLOGÍA Y ARTE DIGITAL Introducción Ejercicio 1 · Implementar una LinkedList genérica. La clase tendrá los siguientes métodos: · estaVacia(): devuelve true si la lista está vacía y false en caso contrario. · extraer(): devuelve y elimina el primer elemento de la lista. · añadir(): añade un objeto por el extremo que corresponda. · toString(): devuelve en forma de String la información de la colección Ejercicio 2 · Define e implementa un método genérico que localice un elemento en un array (ambos se le pasan como argumentos). Supón que los objetos tienen un método equals(obj o) que compara el objeto en curso (this) con el objeto que recibe como parámetro y devuelve true si son iguales y false si no lo son. Ejercicio 3 · Define una método barajar que reordene aleatoriamente los elementos de un array genérico. · 1) Recibe un array y un objeto de tipo Random (java.util.Random); 2) Recorre el array, en orden decreciente, e intercambia la posición actual con una aleatoriamente elegida que va desde la primera posición del array a la actual. · Para obtener una posición aleatoria hacer (Random) random.nextInt((int) i) que devuelve un entero entre 0 y i-1.