1 00:00:00,000 --> 00:00:04,940 Vale, estoy grabando, por lo tanto, todo lo que digáis puede ser usado... 2 00:00:04,940 --> 00:00:06,639 No, puede... 3 00:00:06,639 --> 00:00:10,359 Puede... 4 00:00:10,359 --> 00:00:14,560 Asume que vosotros habéis dado vuestra autorización. 5 00:00:15,240 --> 00:00:22,820 Entonces, nosotros aquí hemos hecho, a partir de una interfaz pública aquí, de una interfaz Milista, 6 00:00:23,420 --> 00:00:28,300 hemos creado una implementación de Milista utilizando arrays, ¿vale? 7 00:00:28,300 --> 00:00:29,800 con estos 8 00:00:29,800 --> 00:00:31,519 si lo tenéis grabados 9 00:00:31,519 --> 00:00:34,259 y podéis pausar y mirarlo 10 00:00:34,259 --> 00:00:35,979 este es el código más o menos 11 00:00:35,979 --> 00:00:37,100 vale 12 00:00:37,100 --> 00:00:40,320 hemos hecho junto, vale 13 00:00:40,320 --> 00:00:42,520 con un main lista que lo prueba 14 00:00:42,520 --> 00:00:43,960 y hace cosas con 15 00:00:43,960 --> 00:00:46,299 esta lista, vale, clase animales 16 00:00:46,299 --> 00:00:48,179 esta de aquí, clase prep, ok 17 00:00:48,179 --> 00:00:50,399 ahora nuestra pregunta y nuestra 18 00:00:50,399 --> 00:00:51,840 duda es, vale 19 00:00:51,840 --> 00:00:54,140 pero mi lista me vale para objetos 20 00:00:54,140 --> 00:00:56,200 entonces me permite crear 21 00:00:56,200 --> 00:00:58,520 listas mezcladas 22 00:00:58,520 --> 00:01:00,179 con todas las clases 23 00:01:00,179 --> 00:01:02,340 posibles, puedo poner dentro animales 24 00:01:02,340 --> 00:01:04,299 puedo poner dentro string, puedo poner 25 00:01:04,299 --> 00:01:06,219 dentro scanner, y no siempre 26 00:01:06,219 --> 00:01:08,379 es lo que quiero, de hecho cuando nosotros hacemos un array 27 00:01:08,379 --> 00:01:10,140 no lo hacíamos así, nosotros hacemos un array 28 00:01:10,140 --> 00:01:12,400 de enteros, un array de string 29 00:01:12,400 --> 00:01:13,420 un array de animales 30 00:01:13,420 --> 00:01:16,500 una cosa parecida a esta 31 00:01:16,500 --> 00:01:18,099 en cierto nivel, es cuando 32 00:01:18,099 --> 00:01:20,280 utilizábamos el polimorfismo y hacíamos 33 00:01:20,280 --> 00:01:20,819 una 34 00:01:20,819 --> 00:01:24,200 un array de vehículos 35 00:01:24,200 --> 00:01:26,079 y luego dentro como vehículos 36 00:01:26,079 --> 00:01:27,640 Podríamos poner coches, aviones 37 00:01:27,640 --> 00:01:29,480 Y no sé qué, porque todos se redaban 38 00:01:29,480 --> 00:01:31,260 De vehículos 39 00:01:31,260 --> 00:01:34,420 Pero, como todo es derivado de objetos 40 00:01:34,420 --> 00:01:36,079 Derivado de objetos 41 00:01:36,079 --> 00:01:38,040 Pues esto es un poco demasiado 42 00:01:38,040 --> 00:01:39,680 Genérica, entonces la pregunta es 43 00:01:39,680 --> 00:01:41,620 ¿Puedo yo crearme una lista 44 00:01:41,620 --> 00:01:43,840 Y decir, oye sí, pero yo quiero que la lista 45 00:01:43,840 --> 00:01:45,659 Solo contenga un determinado tipo 46 00:01:45,659 --> 00:01:47,680 Pero no decir 47 00:01:47,680 --> 00:01:48,939 Oye mira, solo string 48 00:01:48,939 --> 00:01:51,680 Y entonces luego cuando tengo que poner una lista 49 00:01:51,680 --> 00:01:54,019 De animales, por ejemplo, me tengo que crear 50 00:01:54,019 --> 00:01:55,599 Una nueva interfaz 51 00:01:55,599 --> 00:01:57,500 Con una nueva implementación para animales 52 00:01:57,500 --> 00:01:59,239 Y así, así, por cada tipo 53 00:01:59,239 --> 00:02:01,280 No, yo quiero un tipo genérico 54 00:02:01,280 --> 00:02:03,500 En un cierto sentido, quiero decirte, oye, mira 55 00:02:03,500 --> 00:02:05,260 Voy a hacer una lista de 56 00:02:05,260 --> 00:02:08,280 Una clase, me las especificará 57 00:02:08,280 --> 00:02:09,400 Después esta clase 58 00:02:09,400 --> 00:02:11,879 Y voy a utilizar esta clase allí dentro 59 00:02:11,879 --> 00:02:12,800 ¿Vale? 60 00:02:13,580 --> 00:02:15,099 Entonces, para eso 61 00:02:15,099 --> 00:02:17,979 Vamos a 62 00:02:17,979 --> 00:02:20,039 Para no perder lo que hemos hecho ahora 63 00:02:20,039 --> 00:02:23,900 Vamos a copiarlas, estas cosas 64 00:02:23,900 --> 00:02:24,219 ¿Vale? 65 00:02:25,599 --> 00:02:39,340 Le añadimos un genérico detrás, mi lista, ¿vale? Para que lo de lista se quede aquí y esto sea un nuevo ejercicio. 66 00:02:39,340 --> 00:02:49,099 Entonces, la idea es que yo pueda utilizar aquí una declaración de una clase genérica, o sea, de un tipo que por ahora no sé cuál es, 67 00:02:49,099 --> 00:02:51,620 Ma en un futuro sabré cual es 68 00:02:51,620 --> 00:02:52,560 ¿Vale? 69 00:02:53,039 --> 00:02:54,919 Entonces cuando yo creo mi lista 70 00:02:54,919 --> 00:02:56,000 Gen 71 00:02:56,000 --> 00:02:58,500 No es general sobre objeto 72 00:02:58,500 --> 00:03:00,620 Sino que es sobre el tipo 73 00:03:00,620 --> 00:03:01,400 T 74 00:03:01,400 --> 00:03:04,319 Esto quiere decir que cuando añado algo 75 00:03:04,319 --> 00:03:05,879 No lo añado de tipo object 76 00:03:05,879 --> 00:03:07,280 Ma lo añado de tipo T 77 00:03:07,280 --> 00:03:11,460 Y que cuando voy a eliminar algo 78 00:03:11,460 --> 00:03:14,780 Puedo o eliminarlo así con object 79 00:03:14,780 --> 00:03:17,800 Entonces tendré que comprobar que sea T adentro 80 00:03:17,800 --> 00:03:24,800 O puedo directamente decirte, no, no, no, mira, yo quiero que cuando vas a eliminar, el objeto que me pases aquí tiene que ser del tipo correcto. 81 00:03:26,680 --> 00:03:31,379 Cuando busco contains, no quiero buscar un objeto cualquiera, quiero buscar un objeto del tipo T. 82 00:03:31,599 --> 00:03:32,879 ¿Qué tipo es el T? No lo sé. 83 00:03:33,599 --> 00:03:38,560 Si T será string, pues entonces quiere decir que todo esto será en string. 84 00:03:39,039 --> 00:03:41,919 Si T es animal, pues entonces todo esto serán animales. 85 00:03:42,599 --> 00:03:46,159 Y también aquí, cuando devuelvo algo, lo devuelvo como T. 86 00:03:46,620 --> 00:03:49,900 ¿Se entiende? 87 00:03:50,319 --> 00:04:03,060 perfecto, ahora me voy a crear, a modificar mi lista rey y hago mi lista rey genérica 88 00:04:03,060 --> 00:04:18,470 vale, mi lista rey genérica prenderá un tipo genérico y implementará un mi lista de t 89 00:04:18,470 --> 00:04:25,639 Mi lista gen 90 00:04:25,639 --> 00:04:27,300 De t 91 00:04:27,300 --> 00:04:29,180 Así 92 00:04:29,180 --> 00:04:33,500 O sea que ahora yo cuando hago una implementación 93 00:04:33,500 --> 00:04:35,839 Te pasaré un tipo 94 00:04:35,839 --> 00:04:37,319 ¿Vale? 95 00:04:37,420 --> 00:04:39,519 Por ejemplo string o animal o vehículo 96 00:04:39,519 --> 00:04:41,759 Y eso será el tipo 97 00:04:41,759 --> 00:04:44,740 Que tendré que implementar 98 00:04:44,740 --> 00:04:46,420 Estos señores de aquí 99 00:04:46,420 --> 00:04:47,800 Esto de mi lista gen 100 00:04:47,800 --> 00:04:50,000 ¿Sí? 101 00:04:51,000 --> 00:04:53,220 ¿Qué quiere decir esto? 102 00:04:53,759 --> 00:04:56,600 Quiere decir que cuando yo añado algo 103 00:04:56,600 --> 00:04:58,160 Esto será de tipo T 104 00:04:58,160 --> 00:05:00,600 ¿Sí? 105 00:05:01,480 --> 00:05:05,040 Quiere decir que la lista de elementos que tengo aquí dentro 106 00:05:05,040 --> 00:05:06,379 No es una lista de objetos 107 00:05:06,379 --> 00:05:07,480 Sino una lista de 108 00:05:07,480 --> 00:05:09,120 T 109 00:05:09,120 --> 00:05:10,459 ¿Vale? 110 00:05:14,100 --> 00:05:15,500 Esto habrá que ver cómo se hace 111 00:05:15,500 --> 00:05:16,639 ¿Vale? 112 00:05:16,839 --> 00:05:17,660 Esto no me lo pilla 113 00:05:17,660 --> 00:05:21,899 Ya comprobaremos después 114 00:05:21,899 --> 00:05:27,040 Por ahora vamos a ver lo que nos permite hacer rápidamente 115 00:05:27,040 --> 00:05:29,860 Entonces cuando yo creo esta aquí que copio 116 00:05:29,860 --> 00:05:32,699 Pues crearé un array de T 117 00:05:32,699 --> 00:05:36,379 Que será un nuevo array de tipo T 118 00:05:36,379 --> 00:05:38,939 Veis que aquí hay algún error 119 00:05:38,939 --> 00:05:43,139 No me permite hacer un array de este tipo 120 00:05:43,139 --> 00:05:46,459 Pero todo el resto es lo mismo 121 00:05:46,459 --> 00:05:49,220 Estoy cambiando el tipo de objeto 122 00:05:49,220 --> 00:05:50,980 pero al fin y al cabo 123 00:05:50,980 --> 00:05:53,959 el resto del programa 124 00:05:53,959 --> 00:05:56,319 no cambia, es siempre copiar 125 00:05:56,319 --> 00:05:57,439 y hacer las cosas 126 00:05:57,439 --> 00:06:00,120 aquí tengo eliminar que pillará 127 00:06:00,120 --> 00:06:00,920 un objeto T 128 00:06:00,920 --> 00:06:04,040 ahora busca pos 129 00:06:04,040 --> 00:06:06,060 desde aquí, creará 130 00:06:06,060 --> 00:06:08,100 un nuevo array de 131 00:06:08,100 --> 00:06:09,060 T más pequeño 132 00:06:09,060 --> 00:06:11,620 y todo el resto 133 00:06:11,620 --> 00:06:13,680 es lo mismo 134 00:06:13,680 --> 00:06:15,660 si consigo hacer esto 135 00:06:15,660 --> 00:06:18,180 que es el único error, me da el error de 136 00:06:18,180 --> 00:06:20,439 No puedo generar un array 137 00:06:20,439 --> 00:06:21,639 De tipo T 138 00:06:21,639 --> 00:06:24,560 Ya veremos como lo arreglamos esto 139 00:06:24,560 --> 00:06:28,439 Publicing busca post 140 00:06:28,439 --> 00:06:29,500 Esto es T 141 00:06:29,500 --> 00:06:34,480 Aquí no veo otros objetos 142 00:06:34,480 --> 00:06:37,560 Por lo tanto esto debería funcionar 143 00:06:37,560 --> 00:06:38,879 Contains 144 00:06:38,879 --> 00:06:39,620 T 145 00:06:39,620 --> 00:06:46,939 Devuelve un T 146 00:06:46,939 --> 00:06:48,699 Que será un objeto T 147 00:06:48,699 --> 00:06:51,019 Lo encuentra y lo devuelve 148 00:06:51,019 --> 00:06:53,240 Y ya está 149 00:06:53,240 --> 00:06:56,139 Y se acabó 150 00:06:56,139 --> 00:06:56,519 ¿Vale? 151 00:06:56,920 --> 00:06:59,620 La única cosa que me queda para hacer 152 00:06:59,620 --> 00:07:01,000 Este de aquí es 153 00:07:01,000 --> 00:07:03,399 ¿Qué hago con esto? 154 00:07:05,910 --> 00:07:06,589 Ideas 155 00:07:06,589 --> 00:07:08,949 Que podríamos probar 156 00:07:08,949 --> 00:07:11,149 Para que esto funcione 157 00:07:11,149 --> 00:07:12,889 No me permite crear 158 00:07:12,889 --> 00:07:15,509 Un array de objetos de tipo genérico 159 00:07:15,509 --> 00:07:25,259 Y entonces 160 00:07:25,259 --> 00:07:31,939 Entonces la única cosa distinta que he hecho 161 00:07:31,939 --> 00:07:33,800 Con respecto a mi lista 162 00:07:33,800 --> 00:07:35,439 Cuando estaba creando mi lista array 163 00:07:35,439 --> 00:07:36,819 ¿Vale? Que es esta de aquí 164 00:07:36,819 --> 00:07:39,120 Es que cuando creo un nuevo objeto 165 00:07:39,120 --> 00:07:41,899 No lo puedo utilizar, no puedo crear un nuevo array 166 00:07:41,899 --> 00:07:43,180 No puedo hacer un array 167 00:07:43,180 --> 00:07:45,279 De tipos genéricos 168 00:07:45,279 --> 00:07:47,420 ¿Vale? No puedo hacer 169 00:07:47,420 --> 00:07:48,519 Algo como 170 00:07:48,519 --> 00:07:51,759 Elem es igual a 171 00:07:51,759 --> 00:07:53,220 New 172 00:07:53,220 --> 00:07:53,860 T 173 00:07:53,860 --> 00:07:57,139 Entonces la única 174 00:07:57,139 --> 00:07:58,600 Esto me da un error ¿Vale? 175 00:07:58,699 --> 00:08:00,500 No puedo crear objetos nuevos 176 00:08:00,500 --> 00:08:03,040 Pero lo que si puedo hacer es decirme 177 00:08:03,040 --> 00:08:06,639 Mira, créame, un array de objetos que puede contener lo que te da la gana 178 00:08:06,639 --> 00:08:08,620 Y luego me lo tratas como 179 00:08:08,620 --> 00:08:11,959 Un array de ese tipo 180 00:08:11,959 --> 00:08:15,139 Entonces lo puedes guardar dentro de él 181 00:08:15,139 --> 00:08:18,009 ¿Vale? 182 00:08:18,149 --> 00:08:21,730 Y lo mismo se hace las otras veces que aparece esto 183 00:08:21,730 --> 00:08:23,870 Y aquí 184 00:08:23,870 --> 00:08:25,910 La tercera vez 185 00:08:25,910 --> 00:08:37,480 Y una vez que he hecho esto 186 00:08:37,480 --> 00:08:43,539 Este T es un tipo genérico que aquí no hace referencia a nada 187 00:08:43,539 --> 00:08:47,179 Cuando voy a crear un objeto de este tipo 188 00:08:47,179 --> 00:08:49,320 Como por ejemplo aquí 189 00:08:49,320 --> 00:08:58,580 Lo que voy a crear es un objeto y le paso como parámetro el tipo genérico ahora instanciado 190 00:08:58,580 --> 00:09:02,879 Por ejemplo aquí estoy haciendo una lista genérica pero de solo animales 191 00:09:02,879 --> 00:09:07,100 Entonces ya no me permite 192 00:09:07,100 --> 00:09:07,879 Por ejemplo 193 00:09:07,879 --> 00:09:11,159 Lista.add de un string 194 00:09:11,159 --> 00:09:15,009 Esto se enfada 195 00:09:15,009 --> 00:09:17,909 ¿Por qué se enfada? 196 00:09:18,009 --> 00:09:19,049 Porque me está diciendo 197 00:09:19,049 --> 00:09:21,269 Oye mira, addAnimal 198 00:09:21,269 --> 00:09:23,610 En el tipo miListaGeneralAnimal 199 00:09:23,610 --> 00:09:25,889 No es aplicable a string 200 00:09:25,889 --> 00:09:28,389 ¿Cuál es este método addAnimal? 201 00:09:28,389 --> 00:09:29,070 Si add 202 00:09:29,070 --> 00:09:31,909 Tened en cuenta que este método aquí 203 00:09:31,909 --> 00:09:33,990 No está por ningún lado 204 00:09:33,990 --> 00:09:36,690 Add que añade un animal 205 00:09:36,690 --> 00:09:38,090 ¿Está por algún lado? 206 00:09:38,669 --> 00:09:38,990 No 207 00:09:38,990 --> 00:09:42,350 Si me voy a mirar que tengo 208 00:09:42,350 --> 00:09:44,110 Tengo add 209 00:09:44,110 --> 00:09:46,070 Que añade un tipo T 210 00:09:46,070 --> 00:09:48,370 No un tipo animal 211 00:09:48,370 --> 00:09:51,350 Y esto depende del hecho que T 212 00:09:51,350 --> 00:09:52,929 Es un tipo genérico 213 00:09:52,929 --> 00:09:55,309 Que en esta implementación aquí 214 00:09:55,309 --> 00:09:56,250 Es un animal 215 00:09:56,250 --> 00:10:01,169 Y si yo requisiera una lista de strings 216 00:10:01,169 --> 00:10:03,029 Pues haría 217 00:10:03,029 --> 00:10:04,669 Mi lista 218 00:10:04,669 --> 00:10:06,409 Gen 219 00:10:06,409 --> 00:10:08,070 De string 220 00:10:08,070 --> 00:10:12,129 Lista string 221 00:10:12,129 --> 00:10:14,250 Es igual a new 222 00:10:14,250 --> 00:10:17,639 Mi lista 223 00:10:17,639 --> 00:10:20,419 Gen 224 00:10:20,419 --> 00:10:21,960 Array 225 00:10:21,960 --> 00:10:23,759 De string 226 00:10:23,759 --> 00:10:33,009 He hecho, se llama así 227 00:10:33,009 --> 00:10:35,309 Mi lista array 228 00:10:35,309 --> 00:10:35,629 Gen 229 00:10:35,629 --> 00:10:43,169 Y ahora tengo esta lista de aquí 230 00:10:43,169 --> 00:10:45,149 Donde dentro puedo poner solo string 231 00:10:45,149 --> 00:10:47,370 Entonces ahora 232 00:10:47,370 --> 00:10:48,590 Puedo hacer por ejemplo 233 00:10:48,590 --> 00:10:52,509 ListaString.add 234 00:10:52,509 --> 00:10:54,850 Hola 235 00:10:54,850 --> 00:11:01,710 ListaString.add 236 00:11:01,710 --> 00:11:03,370 Cato 237 00:11:03,370 --> 00:11:08,330 Fijaos que el código es único 238 00:11:08,330 --> 00:11:10,710 O sea, el código es esta lista de aquí 239 00:11:10,710 --> 00:11:13,850 Bueno, es interfaz de aquí con este código de aquí 240 00:11:13,850 --> 00:11:17,970 Pero ahora ya me puede servir para cualquier tipo 241 00:11:17,970 --> 00:11:19,649 Que es el problema que teníamos antes 242 00:11:19,649 --> 00:11:22,610 Antes de ver esta cosita aquí 243 00:11:22,610 --> 00:11:24,409 Yo habría tenido que hacer 244 00:11:24,409 --> 00:11:26,110 Mi lista array para string 245 00:11:26,110 --> 00:11:27,470 Mi lista array para animal 246 00:11:27,470 --> 00:11:28,789 Mi lista array para coches 247 00:11:28,789 --> 00:11:31,850 O mantener un lista array 248 00:11:31,850 --> 00:11:33,730 Como esta de aquí que hemos hecho antes 249 00:11:33,730 --> 00:11:35,870 Que es tan genérica que es object 250 00:11:35,870 --> 00:11:37,789 Pero no tengo control 251 00:11:37,789 --> 00:11:39,409 Sobre lo que se puede poner aquí dentro 252 00:11:39,409 --> 00:11:41,370 Porque en esta lista se pueden poner animales 253 00:11:41,370 --> 00:11:42,850 Se pueden poner aviones 254 00:11:42,850 --> 00:11:44,809 Se pueden poner coches 255 00:11:44,809 --> 00:11:46,389 Se puede poner lo que quieras 256 00:11:46,389 --> 00:11:47,769 Porque todos son objetos 257 00:11:47,769 --> 00:11:49,990 Para tener más control 258 00:11:49,990 --> 00:11:51,909 Tengo esta cosa aquí 259 00:11:51,909 --> 00:11:54,190 Tened en cuenta que nadie me prohíbe 260 00:11:54,190 --> 00:11:56,690 De crear un 261 00:11:56,690 --> 00:11:57,789 Mi lista 262 00:11:57,789 --> 00:11:59,070 Gen 263 00:11:59,070 --> 00:12:01,029 De object 264 00:12:01,029 --> 00:12:05,429 Object list 265 00:12:05,429 --> 00:12:07,409 New 266 00:12:07,409 --> 00:12:09,309 Mi lista 267 00:12:09,309 --> 00:12:10,490 Gen 268 00:12:10,490 --> 00:12:12,330 De object 269 00:12:12,330 --> 00:12:19,639 Y esta lista de aquí 270 00:12:19,639 --> 00:12:21,899 Es como la lista que hemos hecho antes 271 00:12:21,899 --> 00:12:23,740 Puedo tener cualquier tipo de objeto 272 00:12:23,740 --> 00:12:28,610 Entonces, esta cosa de aquí 273 00:12:28,610 --> 00:12:32,149 De meterle la clase genérica 274 00:12:32,149 --> 00:12:35,269 No es que reduce mis posibilidades 275 00:12:35,269 --> 00:12:37,610 Mis posibilidades son las mismas 276 00:12:37,610 --> 00:12:39,850 Solo que me aumenta la posibilidad 277 00:12:39,850 --> 00:12:42,769 A decir, oye mira, quiero más control sobre esta lista 278 00:12:42,769 --> 00:12:45,210 Quiero que contenga solo vehículos 279 00:12:45,210 --> 00:12:47,289 Pues entonces le pongo aquí vehículos 280 00:12:47,289 --> 00:12:50,710 ¿Dudas? 281 00:12:52,289 --> 00:12:54,330 Y tened en cuenta que una lista de vehículos 282 00:12:54,330 --> 00:12:56,870 Puede contener coche 283 00:12:56,870 --> 00:12:59,429 Puede contener avión, puede contener tren 284 00:12:59,429 --> 00:13:02,049 Siempre y cuando coche, tren y avión 285 00:13:02,049 --> 00:13:03,269 Pues heredan 286 00:13:03,269 --> 00:13:04,330 De vehículo 287 00:13:04,330 --> 00:13:06,429 Exactamente como lo hacíamos antes 288 00:13:06,429 --> 00:13:08,049 ¿Dudas?