Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: gatoher en 28 de Agosto 2014, 22:37
-
Estoy viendo el tema de los genéricos y me ha surgido una duda.
A ver yo hago este array;
List<Integer> x = new ArrayList<Integer>();
Y mando el array a un método prueba
que va intentar esto;
private void prueba(List<Integer> a){ //Si elimino la parametrización la variable text entra
int pri = 0;
Integer obj = 55;
String text = "hola";
// a.add(text); error es un String
a.add(obj);
a.add(pri);
Iterator it = x.iterator();
while (it.hasNext()){
obj = (Integer) it.next();
pri = (int) it.next();
}
¿Mi pregunta es, por que obj que es un objeto Integer lo tengo que castear? ¿Y pri? No debería el auboxing hacerlo por si solo.
-
Mirando lo más chocante que esto se puede hacer;
Integer p = a.get(0); // a es una lista segura, sino sí habría que hacer casteo
Pero dentro del iterator es lo que no entiendo:
while (it.hasNext()){
Integer p = it.next(); // Sigue pidiendo casteo
-
A ver te explico porque necesitas el casting.
Tu cuando creas un ArrayList, le estas diciendo que tipos de elementos va a contener.
Cuando creas el iterador como lo estas haciendo, empiezas a recorrer la lista y obtienes uno de los elementos de la lista a través del iterador, el iterador no sabe que tipo de elementos está sacando de la lista.
Y por esto tienes que realizar casting, porque el iterador de la forma que tu lo estas creando, devuelve un elemento de tipo Object(Clase padre de todas las clases en java)
entonces el casteo es obligatorio para convertir ese elemento de tipo Object en el tipo que a ti te interesa, en este caso Integer.
En cambio, existe el iterador genérico, para crearlo seria del siguiente modo:
Iterator<Tipo_objeto_a_manejar> nombreIterador= nombreLista.iterator();
De esta manera, ya si le estas diciendo con que tipo de objetos va a manejar el iterador.
Te adjunto un ejemplo de cada iterador:
import java.util.ArrayList;
import java.util.Iterator;
public class TestIterador {
public static void main(String[] arg){
ArrayList<Integer> listaNumeros=new ArrayList<>();
Integer aux;
for(int i=0;i<100;i++){
listaNumeros.add(i);
}
/*Iterador normal, con este tenemos que hacer casting,
porque no sabe que tipo de elementos esta sacando de la lista */
Iterator iL1=listaNumeros.iterator();
while(iL1.hasNext()){
aux=(Integer)iL1.next();
System.out.println("Numero con iterador normal: "+aux);
}
/*Iterador genérico, este si sabe los tipos de los elementos q
saca de la lista, por tanto no es necesario hacer casting */
Iterator<Integer> iL2=listaNumeros.iterator();
while(iL2.hasNext()){
aux=iL2.next();
System.out.println("Numero con iterador generico: "+aux);
}
}
}
Un saludo!!
-
Pues si Dongo, tiene toda la lógica del mundo que haya un iterator genérico. La verdad q ni se me había pasado por la cabeza. :o
Gracias