Lo + Leído
Eventos destacados
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:
- Introducción a Groovy, parte 1 (Andrés Almiray)
- Introducción a Groovy, parte 2 (Andrés Almiray)
- Introducción a Groovy, parte 3 (Andrés Almiray)
- Introducción a Grails (Material Seminario ImaginaWorks)
Los protagonistas te cuentan de qué van los proyectos más importantes del mundo Groovy:
Groovy avanzado
Problemas al utilizar long e int como clave en un map
idecasso - martes 13/10/2009Estoy 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
idecasso - viernes 16/10/2009Si, 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?
Un momento...
Re: Problemas al utilizar long e int como clave en un map
Nacho - martes 13/10/2009Hola,
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.