Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: gatoher en 28 de Agosto 2014, 22:37

Título: Genericos y código Legazy java
Publicado 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;

Código: [Seleccionar]
List<Integer> x = new ArrayList<Integer>();

Y mando el array a un método
Código: [Seleccionar]
prueba que va intentar esto;

Código: [Seleccionar]
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.
Título: Re:Genericos y código Legazy
Publicado por: gatoher en 28 de Agosto 2014, 22:52
Mirando lo más chocante que esto se puede hacer;

Código: [Seleccionar]
   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:

Código: [Seleccionar]
while (it.hasNext()){
                 Integer p = it.next(); // Sigue pidiendo casteo
Título: Re:Genericos y código Legazy
Publicado por: dongo en 28 de Agosto 2014, 23:02
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: 

Código: [Seleccionar]
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:

Código: [Seleccionar]
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!!
Título: Re:Genericos y código Legazy
Publicado por: gatoher en 28 de Agosto 2014, 23:47
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