Secciones

Artículos para tus primeros pasos

Si estás empezando a introducirte en el mundo de Groovy y Grails, no te pierdas nuestros artículos básicos: 

Entrevistas con los expertos
 

Los protagonistas te cuentan de qué van los proyectos más importantes del mundo Groovy:


Un proyecto de:
ImaginaWorks
Campus Escuela de Groovy

Groovy avanzado

Problemas al utilizar long e int como clave en un map

idecasso - martes 13/10/2009

Estoy haciendo una aplicacion en donde utilice como clave un long en un map, es decir

long clave = 1

map = [:]

map[clave] = objeto

el problema es que en una parte utilice sin darme cuenta un int para obtener el valor

int clave = 1

e = map[clave]

el problema es que al usar el int no me devuelve el objeto esperado, sino null, a pesar de ser el mismo valor,  solo que en lugar de un long es un int, por lo tanto, al parecer no se invoca el metodo equals entre long e int en un map para la clave, alguien sabe si esto es un bug?

Re: Problemas al utilizar long e int como clave en un map

Nacho - martes 13/10/2009

Hola,

en mi opinión ni son iguales ni deberían serlo. Aunque el valor numérico sea el mismo, uno es un objeto Integer y el otro Long (recuerda que en Groovy no se usan los tipos primitivos), por tanto al tener tipos distintos son objetos diferentes.

 

Re: Problemas al utilizar long e int como clave en un map

idecasso - viernes 16/10/2009

Si, el punto es que hay una divergencia aqui en el comportamiento, hice la siguiente prueba:

long x = 4
int y = 4
println (x == y)
println (x.is(y))
println (x.equals(y))

la salida es

true

true

false

false

false

false

 

Si observamos, la sobrecarga de groovy del == nos da true, pero is nos da false e incluso invocar a equals directamente nos da false. El asunto parece ser que no es igual la implementación. Hice la prueba con Java, en donde incluso el Netbeans avisa que los tipos no son compatibles.

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Long x = new Long(4);
        Integer y = new Integer(4);
        //No podemos comparar directamente las direcciones de memoria
        //System.out.println((x == y));
        //System.out.println((y == x));
        System.out.println(x.equals(y));
        System.out.println(y.equals(x));
    }
}

 

La salida:

false

false

 

Entonces el punto es que no podemos tener una implementacion que dice false y la sobrecarga de operadores dice true, eso es un error de diseño, por lo menos desde mi punto de vista.

Además me imagino que para este punto en el Map se usa la implementacion que tiene Java, la cual usa equals y por lo tanto devuelve false. Desde mi perspectiva no es que el problema sea si son o no de la misma clase, el problema es que no pueden devolver con == verdadero y con equals falso. El problema es que este tipo de error es dificil de cambiar si se opta por decir que no son iguales, dado que  existen sistemas que utilizan el == y esperan que sean verdaderos si el valor es igual. Como clasificamos esto, como bug o como error de diseño?

Re: Problemas al utilizar long e int como clave en un map

idecasso - viernes 16/10/2009
La salida es doble en el primer ejemplo por que hice la prueba con y == x, etc. Pero me falto pegar esa parte.
Responder al hilo | Volver al foro "Groovy avanzado" | Volver a los foros