无法从地图中获取对象,为硬编码值和动态值提供 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 中一样,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 中,您在域 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 但是除非您知道动态语言的行为方式,否则这很烦人哈哈。
我不知道如何描述这个问题,好奇怪。我有这样的功能:
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 中一样,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 中,您在域 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 但是除非您知道动态语言的行为方式,否则这很烦人哈哈。