Autor Tema: CU00671B conversión de tipos en java remove de ArrayList falla si paso Integer  (Leído 3943 veces)

adrianpza

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 6
    • Ver Perfil
 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

        }
« Última modificación: 09 de Marzo 2015, 08:46 por Alex Rodríguez »

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Re:CU00671B conversión de tipos en java
« Respuesta #1 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.

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
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.

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
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

 

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".