Autor Tema: Genericos y código Legazy java  (Leído 3125 veces)

gatoher

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 86
    • Ver Perfil
Genericos y código Legazy java
« 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.
« Última modificación: 29 de Agosto 2014, 09:10 por Alex Rodríguez »

gatoher

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 86
    • Ver Perfil
Re:Genericos y código Legazy
« Respuesta #1 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

dongo

  • Intermedio
  • ***
  • Mensajes: 177
    • Ver Perfil
Re:Genericos y código Legazy
« Respuesta #2 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!!

gatoher

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 86
    • Ver Perfil
Re:Genericos y código Legazy
« Respuesta #3 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

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".