无法从地图中获取对象,为硬编码值和动态值提供d / t结果,但具有相同的值

时间:2015-03-24 11:23:17

标签: groovy

我不知道如何描述这个问题,太奇怪了。我有这样的功能:

long getPersonId(...){
//...
}

上述函数根据某些参数返回一个人的Id。

所以我记录了函数的返回值,它是1

然后我有这样的代码:

person = myMap.get(getPersonId(..))

返回null对象,但是返回一个有效的Person对象,为什么?:

person = myMap.get(1)

但正如我在getPersonId(..)之前所述,返回1,这基本上意味着

myMap.get(getPersonId(..)) == myMap.get(1)

myMap输入为Map<Long, Person> myMap

这里发生了什么?

2 个答案:

答案 0 :(得分:3)

在Groovy中,与Java一样,1 int 文字,而不是 long ,所以

myMap.get(1)

正在尝试查找键Integer.valueOf(1),而

myMap.get(getPersonId(..))

正在查找密钥Long.valueOf(getPersonId(...))。您需要确保在填充地图时肯定使用的是Long个密钥,而不是Integer个密钥,例如

myMap.put(1L, somePerson)

your original version of this question中,您在域类而不是get方法上调用GORM java.util.Map.get方法,并且该方法应该按照GORM方法调用的要求工作,将ID转换为在将它传递给Hibernate之前适合你的类型。

答案 1 :(得分:1)

我很抱歉问题在于我初始化地图myMap

Map<Long, Person> myMap = [1, new Person()]

当你说出这样的话时,关键是integer但不是long仍然没有抱怨。

所以问题是我的方法返回一个长值(1L),但我在地图上的实际键是整数值(1)。

所以将我的map init更改为Map<Long, Person> myMap = [1L, new Person()]解决了这个问题。

可能这是由于动态的自然常规但令人恼火,除非你知道动态langs表现如何lol。