Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: adrianpza en 08 de Marzo 2015, 19:04

Título: CU00671B conversión de tipos en java remove de ArrayList falla si paso Integer
Publicado por: adrianpza en 08 de Marzo 2015, 19:04
 hola a todos,,,porque aqui no se hizo la conversion  como yo señale en rojo ?? si el metodo get tambien espera recibir un tipo primitivo.... agradeceria su respuesta saludos..

 
Código: [Seleccionar]
//Ejemplo aprenderaprogramar.com

        for (int i=0; i < tmpAL.size(); i++) {

            System.out.println ("Eliminamos ítem "+ (tmpAL.get(i)+1) +": " + miListadoAL.get([color=red](int)[/color]tmpAL.get(i) ) );

            miListadoAL.remove( (int) tmpAL.get(i) );   //Introducida conversión de tipos

        }
Título: Re:CU00671B conversión de tipos en java
Publicado por: toni_apr en 08 de Marzo 2015, 22:50
Hola adrianpza
Muy buena observación. ¿Por qué en el get no hace falta y en el remove si.?

No estoy seguro. Pero aventuro lo siguiente:

El método remove utiliza un int (primitivo) para encontrar manipular/borrar el elementos en cuestión. Está diseñado internamente así. Espera un int si o si.

En cambio el get está diseñado internamente para 'devolver' el contenido del elemento. Una vez puede ser un Integer como es el caso, o un objeto de tipo Persona, o Rueda, etc. y devuelve objetos distintos según cada caso.
Pienso que este método (el get) lo han diseñado para adaptarse a cualquier tipo de objeto. Y eso cuenta con hacer conversiones como el caso actual de Integer a int que son compatibles,

Es decir
    tmpAL.get(i)
siempre devuelve un Integer
pero
    miListadoAL.get(...)
recibe un Integer que sabe convertir a int que es lo que necesita.

Desde aquí se podría decir. ¿Por qué no han preparado al método remove para que haga lo mismo? ...

Si alguien conoce una respuesta fidedigna, pido que nos ilumine en este desconocimiento.

Salud.
Título: Re:CU00671B conversión de tipos en java remove de ArrayList falla si paso Integer
Publicado por: Alex Rodríguez en 09 de Marzo 2015, 08:47
Hola, en el api java tenemos:

get: get(int index) Returns the element at the specified position in this list. En este ejemplo, si el ArrayList es de Integer, nos devolverá un Integer. Como dice toni_apr, aquí nos devuelve un Integer, pero podría ser un objeto Persona, Rueda u otro tipo según el caso.

remove: remove (int index) Removes the element at the specified position in this list. Este método no devuelve nada, únicamente elimina el elemento en la posición especificada.



Coincido con toni, en  miListadoAL.get(tmpAL.get(i) ) el compilador está haciendo una conversión automática de tipos

Y en  miListadoAL.remove( tmpAL.get(i) ); no la hace, requiere que se le indique explícitamente miListadoAL.remove( (int) tmpAL.get(i) );

¿Por qué? Se trata de detalles de bajo nivel del compilador, algo que los desarrolladores del compilador han decidido que sea así (o que han dejado así sin intención explícita y que quizás cambien en futuras versiones del lenguaje).

Y a modo de resumen, ¿cómo saber qué hacer en cada caso? Lo más correcto pienso que sería pasarle siempre a un método el tipo que requiere el método, en este caso si los métodos requieren int, lo indicaríamos explícitamente:


         for (int i=0; i < tmpAL.size(); i++) {
            System.out.println ("Eliminamos ítem "+ (tmpAL.get(i)+1) +": " + miListadoAL.get((int)tmpAL.get(i) ) );
            miListadoAL.remove( (int) tmpAL.get(i) );   //Introducida conversión de tipos
        }

Aquí está indicado explícitamente que se pasa un int a aquellos métodos que requieren int, con lo cual no estamos a expensas de si el compilador realizará o no la conversión automática. En general nos confiamos pensando que la conversión automática lo hará todo correctamente pero podemos encontrarnos con casos en que no es así.

Adicionalmente: los métodos remove son especialmente problemáticos, porque a diferencia de los métodos get que sólo consultan lo que existe en el objeto, los métodos remove modifican el objeto. Quizás eso pueda darnos pie a pensar que los creadores del compilador decidieran no hacer conversiones automáticas en métodos especialmente delicados. Habría que preguntárselo a ellos...

Saludos.
Título: Re:CU00671B conversión de tipos en java remove de ArrayList falla si paso Integer
Publicado por: toni_apr en 09 de Marzo 2015, 22:30
Gracias Alex por tu explicación detallada.

Entiendo que los desarrolladores son los que en el fondo deciden el comportamiento de su código.

Y que tal como dices, es nuestra responsabilidad aportar a los métodos los parámetros adecuados según su necesidad.

Saludos