List.retainAll()没有按预期工作(grails 2.3.9)

时间:2015-03-04 14:27:43

标签: grails groovy

我几乎肯定做错了什么或误解了List.retainAll()。

我有两个相等的列表(size()== 1),但是当我调用list1.retainAll(list2)时,列表1变为空。

代码:

List<DomainObject> list1 = someService.getData()
List<DomainObject> list2 = someService.getOtherData()
log.info("Equal: ${list1.equals(list2)}") 
boolean changed = list1.retainAll(list2)
log.info("Changed: ${changed}")
log.info("list1 empty: ${list1.isEmpty()}")

日志显示:

Equal: true
Changed: true
list1 empty: true

我......不知道自己做错了什么。我使用更通用的对象运行测试(实际的域对象相当复杂,但正确地实现了equals / hashcode)并且retainAll按预期工作。

我甚至不确定我应该问什么具体问题......是否有条件我错过了equals()可以返回true但retainAll()失败了?

1 个答案:

答案 0 :(得分:1)

希望能帮助其他人,这是我应该知道并且之前遇到的事情。

list1.equals(list2) //true, one element per list
list1.get(0).id == list2.get(0).id //true, same DB object
list1.get(0).equals(list2.get(0))  //false...  ?!

原因是equals()从以下开始实施:

equals() {  
    if(getClass() != o.class) return false
}

getClass()返回DomainObject,但o.class(或o.getClass())正在返回javaassist__blahblah

我用

替换了支票
if(!(o instanceof DomainObject)) return false

不确定这是否是最平等的等级检查方式,出于某种原因,我认为instanceof的速度很慢。