我正在使用 PriorityQueue,并且我覆盖了 MyClass 中的 equals,
PriorityQueue<MyClass> pq = ...
Run Code Online (Sandbox Code Playgroud)
我想让一些外来对象等于MyClass,
if (pq.contains(foreignObj)) {
...
}
Run Code Online (Sandbox Code Playgroud)
当我研究 PriorityQueue 的实现时,它是这样调用的,
o.equals(queue[i])
Run Code Online (Sandbox Code Playgroud)
其中“o”是foreignObj,“queue[i]”是MyClass 的实例。这引起了一个主要问题,因为我期望它称为 MyClass 的 equals,因为我拥有它,这样我就可以使任何类型的对象“等于”我的对象。而且,我不拥有外部类的源代码,也无法更改那里的任何内容。
为什么它没有按下面的代码编写,所以它会调用我的 equals 而不是我无法控制的其他人?
queue[i].equals(o)
Run Code Online (Sandbox Code Playgroud)
无论和是什么,调用者都可以期望a.equals(b)
和得到相同的结果,只要它们不为空。它由方法的契约保证。b.equals(a)
a
b
equals
您的实现不合法,因为它不是对称的。根据API 文档:
该
equals
方法在非空对象引用上实现等价关系:
- 它是自反的:对于任何非空引用值
x
,x.equals(x)
都应该返回true
。- 它是对称的:对于任何非空引用值
x
和y
,x.equals(y)
应返回true
当且仅当y.equals(x)
返回true
。- 它是传递性的:对于任何非空引用值
x
、y
、 和z
,如果x.equals(y)
返回true
和y.equals(z)
返回true
,那么x.equals(z)
应该返回true
。