grails - List.retainAll()不能按预期工作(2.3.9版)

标签 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()失败的地方,我是否缺少条件?

最佳答案

希望可以帮助其他人,这是我应该知道并且曾经遇到过的事情。

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

不知道这是否是在equals中进行类检查的最干净方法,由于某种原因,我感到instanceof很慢。

关于grails - List.retainAll()不能按预期工作(2.3.9版),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28856970/

相关文章:

grails:如何更改编译的 GSP(gsp*.class 文件)?

grails - Grails 中的 lib 目录

java - Groovy - 压缩多个 if 语句

groovy - 创建根级gradle任务以供多个子项目使用?

java - 在我的 Java EE 应用程序中编译 Groovy 代码

java - JDBC 中古怪的 latin1 到 UTF8 的转换

grails - grails/ivy代理排除?

hibernate - 解决标准生成器中缺乏 sqlProjection 支持的问题吗?

mysql - groovy : Retrieving diff value 中的 BigDecimal 值存在问题

grails - 找不到构造函数 'java.lang.String'的参数0