我有一种分离两个物体的方法
在方法的开头,我从DB(SpringData JPA / HIBERNATE)检索两个对象,我们将其命名为类型A的object1和类型B的object2,然后我比较object1.getB().equals(object2)
和{{1} }与object1.getB
相同,结果为object2
。为什么?如果我调试方法,我可以看到object2和对象2的属性B具有相同的类false
。为什么有这个奇怪的名字?不应该只是B?在比较时B_$$_jvst1a4_5
方法infact
equals
我获得if (getClass() != obj.getClass())
return false;
,因此返回false。
有人能解释我这种行为吗?
答案 0 :(得分:2)
您使用在运行时生成类的库(代理类)。
你永远不应该依赖getClass()
这些代理类来比较两个实例的类,因为你没有手,并保证Hibernate(这里)和Spring(当你使用它)如何生成它们。
作为equals()
的备选方案,您应该使用instanceof
运算符来确定对象是否是编译时已知的类的实例:
if (myObject instanceof MyClass){
...
}
无论如何,在instanceof
实现中应始终优先考虑equals()
,以免破坏子类实例的方法行为。