我不知道如何描述这个问题,太奇怪了。我有这样的功能:
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
这里发生了什么?
答案 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。