Bienvenidos.
Continuamos una nueva sección con los genéricos de Yaba o Lleba Generics.
Bueno, esta nueva característica se introdujo en la versión 5 de JDK con el objetivo de que nuestro
código sea mucho más reutilizable y también reducir errores relacionado al tipo de datos.
Cuando hacemos cast, cuando convertimos de un tipo a otro agregando una capa de abstracción sobre los
tipos, claro, entonces nos permite crear clases e interfaces que ya son genérica, pero hacerla mucho
más genérica.
Bueno, como el ejemplo que tenemos nuestro ejemplo repositorio, después lo vamos a modificar para
que utilice generics de Yaba y así sea, pero 100 por ciento reutilizable.
Es decir, no solamente sea aplicable a cliente, sino también a cualquier tipo objeto para tener un
repositorio tanto de cliente como de usuario común y corriente, pero también de facturas, de un producto
o de lo que sea, cualquier cosa.
Bien, vamos a hacer algo distinto.
Vamos a seguir trabajando en este proyecto porque después, como digo, lo tenemos que modificar.
No quiero crear un proyecto nuevo después de tener que abrir nuevamente el repositorio.
En fin.
Entonces vamos a trabajar sobre este mismo proyecto.
Bueno, y por supuesto, antes de modificar y emigrar a Generics, vamos a trabajar un poco.
Vamos a ver desde la base ya con esta característica de los tipos genéricos me comenzemos, pero si
vamos a cerrar todas las clases, entonces cerramos.
Cerrar todas mantenemos acá el РАМКАХ.
Listo, vamos a crear un.
Entonces p o interfases new pacato.
Entonce or a Guzmán, en vez de peó interfases, vamos a tener acá un рамках generics o genericos,
se fijan?
Entonces bueno, acá tenemos generics o genericos y interfases.
Acá está nuestro ejemplo anterior.
Acá vamos a crear todo nuestro ejemplos y programa utilizando generics desde la base.
Comencemos.
Vamos a crear una clase con el método main.
Ejemplo genericos.
Me.
Bien, vamos a partir desde la raíz y la necesidad de implementar estos tipo de auto para hacer nuestras
aplicaciones más segura en todo lo que conversión de tipo datos y trabajar con distintos tipos que sean
mucho más genéricos.
Reducir también errores de compilación.
En fin, partamos primero.
Ya sabemos, hemos visto algo sobre las listas y ya sabemos que traja con genéricos se fijan list.
Acá se agrega un tipo de dato.
Ya, pero por ahora simplemente el lista la vamos a importar.
Si la vamos a importar de yaba útil.
Perfecto.
List igual new array.
Listo.
Ven y vamos a quitar estos corchetes triangulares que se le conoce.
O también operador diamante.
También se le conoce como diamante.
Listo.
Se fijan y vamos a trabajar con cliente.
Entonces acá vamos a colocar el nombre de variable clientes.
Entonces hacer una lista de clientes.
Perfecto.
Lo siguiente.
Bueno, agrega Cliente.
Ya tenemos nuestra clase cliente del ejemplo anterior.
Así que la vamos a reutilizar.
Esta acá.
Entonces.
Clientes.
Punto.
Se fijan igual me permite crear objetos, pero como nos estamos manejando genérico de Java por defecto
va a ser del tipo Object, el tipo más genérico que lleva.
Entonces vamos a agregar un new cliente.
Lo importamos de este pacato.
Andrés Guzmán.
Perfecto.
Ahí tenemos un cliente.
Bueno, podría agregar más, pero para el ejemplo da lo mismo.
Ahora, qué pasa si yo quiero obtener este cliente?
Entonces el cliente del Abandoned Andrés igual hay dos formas clientes.
Punto guet con el índice sabemosque pertencer.
Entonces puedo obtener a través del índice 0, que es el primero.
Andrés está en el 0, pero acá marca un error de sintaxis porque ya no sabe con qué tipo estamos trabajando.
En ninguna parte se indica, se fijan.
Entonces está asumiendo que es del tipo Hoggett?
Bueno, es del tipo Hoggett.
Pero tenemos que indicar de forma explícita de qué tipo es en concreto.
Es decir, cliente.
Y para eso tenemos que hacer un cast.
Se fijan?
Listo.
Cliente.
Hay solución al problema?
Bien, yo puedo trabajar con Andrés.
En fin, esto sería una forma para obtener el cliente.
Otra forma es utilizando el imperator.
Por ejemplo, si colocamos acá iterador y datos, movemos el cursor, ya que es un iterador punto next.
Obtenemos el primer elemento, se fijan y también obtenemos el elemento cero.
Índice cero Andres.
Pero lo mismo.
Next Por defecto va a retornar un tipo genérico del tipo objeto.
Se fijan, pero lo estamos asignando al tipo cliente.
Por lo tanto, requiere hacer el často y eso es un problema.
Porque qué pasa si como desarrollador o cualquier programador se equivoca y en a colocar acá cliente.
Por ejemplo, colocamos un string.
Y acá también se fijan.
No da error, pero está guardando clientes y no tipo de datos string.
Se fijan?
Entonces, bueno, yo podría ejecutar esto.
Vamos a ver qué pasa.
Lanzo un error.
No acepto un cast exception, es decir, no puede convertir a un cliente en un tipo string.
Y es correcto.
Bueno, para evitar este tipo de problema es que se crea esta necesidad de implementar tipos genéricos
en Java.
Para qué?
No solamente evitar errores y también ensuciar nuestro código con el cast, sino que también para que
sea más reutilizable.
Entonces esto mismo puede quedar mucho mejor si se fijan.
De hecho, voy a cerrar acá y vamos a agregar acá el tipo cliente.
Entonces indicamos de forma explícita que vamos a crear una lista, un ArrayList de cliente indicamos
el tipo.
Por lo tanto, esta lista va a trabajar por detrás con los clientes y acá de forma opcional.
Después del nombre de la clase, colocamos también el operador diamante.
Se fijan, pero es opcional colocar el cliente.
De hecho, es redundante.
Cliente se puede omitir.
Se fijan incluso acá lo dice.
Es redundante.
Simplemente se puede colocar la llave triangulares.
O Diamante.
Nada más.
Acá indicamos el tipo y acá sí que me marca error en tiempo, no de ejecución, sino es decir, cuando
estoy escribiendo código es mucho más robusto en todo lo que es manejo de error.
Entonces, simplemente acá ya no necesario tener que hacer el cast.
Lleca cliente de Vigen.
No pidas ser casto.
De hecho, si hacemos caso, también sería redundante.
Lo podemos hacer, sí, pero lo necesario, ya que lo estamos indicando acá, acÃstica es redundante.
De hecho, lo marca acá en gris remover redundante gasto.
Entonces es mucho más limpio, nuestro código es mucho más transparente y eso es lo que es.
Los genéricos de ya bien.
Pero también podemos crear métodos genéricos, crear clase genérica.
En fin, es lo que vamos a ver antes de modificar nuestro ejemplo repositorio que tenemos acá.
Entonces la idea es partir desde la base.
Bueno, vamos a tener, por ejemplo, un método.
Bueno, puede ser lo mismo.
Estos aplica tanto métodos estáticos o métodos de la instancia que no sean estáticos para este ejemplo.
Como estamos trabajando en el main, que es estático.
Bueno, vamos a crear un método estático genérico.
Bien, entonces un public static vamos a retornar una lista.
Bueno, la idea es convertir un arreglo de algún tipo de objeto.
Por ejemplo, arreglo de clientes, convertirlo en un tipo list de cliente, en una lista de clientes.
Entonces convertir de arreglo a lista.
Entonces, por supuesto, va a retornar un list.
Bien, por ahora lo dejaré así, tal cual.
Cliente cliente perdonar una lista cliente entonces from array hacia tu list convertir a una lista.
Bien, entonces pasamos como argumento un arreglo cliente corchete.
Le vamos a llamar C de clientes por nombre que queramos y listo.
Entonces, cómo podemos convertir?
Bueno Rotor, hay varias formas, pero después vamos a ver el API Stream de Java con el API Stream.
Hoy tenemos diferentes mecanismos, pero también podemos utilizar arrays.
La clase helpers a raíz de lleba útil la importamos de Java útil.
El método hace el list que puede recibir un arreglo y convertirlo a una lista.
Colocamos C por ejemplo se fijan ya acá tenemos un método, pero el problema es que muy concreto es
poco reutilizable, poco genérico por así decir, ya que solamente nos permite crear, es decir, convertir
un arreglo de clientes a una lista de clientes, pero solamente clientes.
Y yo podría querer convertir cualquier tipo de dato, no solamente clientes, un producto, una factura,
un automóvil o lo que sea, se fijan.
Entonces acá entran los genéricos hacer métodos mucho más reutilizable, que se apliquen a cualquier
tipo de auto, es decir, que tu argumento sean qué tipo?
Cómo?
Bueno, lo primero en la declaración del método en el cuerpo, justo después del modificador o modificadores
y antes del retorno del tipo auto, vamos a colocar las llaves triangulares o diamante y acá vamos a
indicar el genérico.
Acá estoy especificando que vamos a utilizar un método genérico por convención se escribe en mayúscula
una sola letra.
Da lo mismo, puede ser t, r, e o lo que queramos, pero típicamente se utiliza T para trabajar con
listas.
Ya, pero da lo mismo.
Entonces colocamos té y acá reemplazamos en vez de clientes.
Vamos a usar este genérico té, entonces puede ser cualquier cosa.
Y acá, por supuesto, en vez de cliente T.
Y listo.
Ahí tenemos un método genérico y ya no solamente pueden convertir clientes, sino también un arreglo
de números de enteros, un arreglo de string.
En fin, bien, pongámoslo en funcionamiento.
Vamos a crear por acá un arreglo de cliente cliente, por ejemplo, bien corchete clientes y vamos a
crear así, no cierto?
Acá.
Perdón, cliente no, porque ya lo tenemos acá en la lista.
Vamos a colocar clientes.
Arreglo, eso sí.
Perfecto.
Entonces ahora vamos a tener Andrés este de acá.
De hecho, podría copiar esto.
Y podríamos tener dos, entonces uno coma.
Voy a bajar dos.
Listo.
Hoy tenemos dos, dos clientes.
Acá falta cerrar y me falta cerrar el primero.
Lucy Martínez.
Y el segundo?
Bueno, Andrew Goodman, perfecto.
Ahí tenemos un arreglo.
Pero también podría tener un arreglo de Integer corchete enteros.
Uno, dos, tres.
Perfecto.
Electo.
Y así también podremos tener lo que sea un string o cualquier tipo.
Ahora vamos a probar.
Ya tenemos una lista de clientes.
Se fijan un cliente, pero voy a tener otra.
Pero esta otra base, la conversión del arreglo utilizando este método.
Entonces por acá un listo cliente.
Le voy a llamar clientes.
Dos se fijan para no tener conflicto conectÃ que ya existe.
Entonces igual el método estático from from array tú listo.
Perfecto.
Entonces pasamos.
Está acá el arreglo de clientes clientes arreglo se fijan.
Entonces puedo convertir un arreglo cliente arreglo en una lista de cliente utilizando este método de
forma genérica, pero también convertir enteros en tellano una lista de enteros enteros.
Dos, porque el enteros acá es un arreglo.
Se fijan iete en la lista.
Bueno, podríamos organizar los nombre para que?
Para que esté más claro.
Por ejemplo enteros arreglo perfecto.
Y este enteros lista.
Y acá clientes lista.
Bien, ahora from array tu list pasamos enteros arreglá.
También se fijan, y así es compatible con cualquier tipo.
Y lo hace genérico.
Entonces, ahora, por ejemplo, clientes lista.
De acá.
Punto foreach.
Podemos imprimir.
Usamos la forma con método de referencia.
Entonces 7 en punto.
Otro punto.
Punto y acá.
Print line perfecto.
Pero también esto mismo para enteros.
Enteros.
Lista.
Punto.
forEach.
Y lo vemos.
Vamos a probar.
Vamos a levantar.
Entonces acá tenemos una lista de clientes, una lista de enteros.
Voy a cerrar acá.
Continuamos.
Bien, ahora este método solamente recibe un parámetro.
Esto se le conoce como parámetros genéricos, ya que trabajamos de forma genérica con estos tipos de
datos.
En nuestro método, pero como tenemos uno solo, podríamos tener más separado por comas.
Bien, voy a copiar este método y vamos a tener una sobrecarga.
Entonces bueno, acá voy a colocar coma, je.
Recuerden usar tipos mayúscula es convención, ya es estándar.
Entonces una sola letra alfabética y en mayúscula.
Pero bien va a retornar una lista de temas de este tipo.
No dejé entonces la idea de que este método from array tu list, pero la idea de que convierta el té,
el tipo té genérico está acá y el té acá.
Imprima, muestre el dato.
Bien, entonces vamos a tener.
Bueno, podría ser, por ejemplo, cualquier tipo, ya no necesariamente un arreglo.
Acá estamos trabajando con arreglo para convertirlo a un tipo lista, pero podría ser, no un arreglo.
Se fijan un tipo de gían y hacer algo con este tipo de dato de acá para que sea más explicativo.
Vamos a utilizar arreglo para poder iterar y mostrarlo.
Entonces dos arreglo, uno del tipo té y otro el tipo G.
Acá lo indicamos.
Acá se definen los tipos genéricos como parámetros en el método y acá trabajamos con estos tipos.
Entonces ya sabemos, el C es para convertir y el G lo vamos a iterar.
Entonces for quiero iterar el G de qué tipo de dato es?
Es un arreglo del tipo G.
Este es el tipo y este es el nombre de la variable o argumento.
Como le puse G le voy a poner X o da lo mismo si el nombre del argumento.
Y este es el tipo acá, entonces es del tipo Jía elemento.
También nombre variable de lo mismo, de la fuente del origen.
Cuál es el origen?
X.
El arreglo shout que vamos a imprimir elemento.
Y listo.
Tenemos un método con dos tipos genéricos.
Uno simplemente lo itera y lo imprime.
Que del tipo genérico ojeé, pues ser cualquier cosa, cualquier tipo dato y otro del tipo T también
cualquier otro tipo dato, pero lo muestra, es decir, lo convierte, pero lo convierte a una lista.
Bien, vamos a ver acá cómo sería.
Voy a copiar.
O mejor, voy a crear acá otra cosa del tipo string.
Un list del tipo String.
Nombres Vejan from acá ArrayList.
Vamos a pasar un arreglo nombre en una forma.
Bueno, ya sabemos que podemos crear acá un areal del tipo arreglo clientes Integer, pero también podemos
crear un areal al vuelo Mikki, una variable, una instancia al vuelo, por ejemplo New String String
corchete con los elementos y acá separador coma por ejemplo Andrés, Pepe Coma.
Voy a bajar Lucy.
Vea ya John se fijan bien, ahí tenemos con 1.
Entonces con uno solo solamente va a convertir, pero si colocamos coma y otro arreglo lo va a imprimir
y convertir.
Por ejemplo, el segundo podría ser cualquiera entero.
Arreglo voy a reutilizar esta acá enteros arreglo.
Se fijan y lo vas a ejecutar.
Qué pasa si fijan?
Acá imprime 1, 2, 3.
Claro, porque el segundo que se pasa por argumento acá lo imprime y el primero lo convierte a una lista
o una lista de nombres.
Nombres punto foreach.
Ahora imprimimos los nombres de la lista.
Bejan, André, Pepelu, Silbé y John.
Y eso tipo de dato genérico, pero métodos.
La próxima clase continuamos con estos tipos genéricos, también de métodos, pero un poco más limitados,
que se le conoce como vande generics bonded de límite.
Es decir, limitar a que, por ejemplo, los tipos genéricos sean una implementación de una interfaz
o de una clase abstracta, o una clase padre o superclase.
Continuamos en la siguiente clase.