我注意到在Grails中调用域类的列表时,返回的结果是代理实例而不是实际的域类实例。
示例:
println User.list()
[ com.mypackage.security.User_$$_javassist_28 ]
将这些代理类之一的实例与匹配的域类实例进行比较时,我收到错误的相等结果。
Groovy"与Java的差异"文件说明:
==表示所有类型的等号。 ... 因此,为简单起见,==表示Groovy中的equals()
然而,当将域类与这些代理类之一进行比较时,这似乎并不正确。
有人可以对此提供一些见解吗?
有没有办法调用列表并接收实际的域类实例?
我宁愿不必提供自定义的getHashCode并等于实现只是为了解决这个问题。
谢谢。
答案 0 :(得分:0)
我认为你不能使用list()返回不同的类型,并且==
返回false应该没有任何事情可以做列表返回的类型。
在Java中,对于相同类型的2个对象,您必须实现equals
和hashCode
。即使您可以使用==
来测试相等性,Groovy也会分享相同的内容。
支持你的平等问题。
==表示所有类型的等号。 ... 因此,为简单起见,==表示Groovy中的equals()
这不是全部。
Here是一个更好的解释。
在通过正常的Groovy“强制”机制可能认为两个对象“相等”的情况下,==运算符会将它们报告为相等;如果这样做会破坏Java在equals方法周围的正常规则,那么.equals()方法就不会这样做。
既然你想避免实现,你可以利用Groovy AST。
您可以使用@EqualsAndHashCode
注释该类,以便为您处理它。
Grooydoc here.