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

Unable to get an object from a map giving d/t result for hardcoded value and dynamic value but having equal value

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

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

以上函数returns 一个人的 Id 基于一些参数。

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

然后我有这样的代码:

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

哪个 return 是空对象,但是这个 return 是一个有效的 Person 对象,为什么?:

person = myMap.get(1)

但是正如我之前描述的getPersonId(..) returns 1,这基本上意味着

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

myMap 键入为 Map<Long, Person> myMap

这里发生了什么?

在 Groovy 中,与在 Java 中一样,1int 文字,而不是 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 中,您在域 class 上调用 GORM get 方法,而不是 java.util.Map.get 方法,这应该像 GORM 方法一样按要求工作在将 ID 传递给 Hibernate 之前调用将 ID 转换为适合您的类型。

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

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

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

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

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

这可能是由于动态性质造成的 groovy 但是除非您知道动态语言的行为方式,否则这很烦人哈哈。