调用 equal 的方式错误?

Nat*_*n W 1 java equals

我正在使用 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)

Joh*_*ica 7

无论和是什么,调用者都可以期望a.equals(b)和得到相同的结果,只要它们不为空。它由方法的契约保证。b.equals(a)abequals

您的实现不合法,因为它不是对称的。根据API 文档

equals方法在非空对象引用上实现等价关系:

  • 它是自反的:对于任何非空引用值xx.equals(x)都应该返回true
  • 它是对称的:对于任何非空引用值xyx.equals(y)应返回true当且仅当y.equals(x)返回true
  • 它是传递性的:对于任何非空引用值xy、 和z,如果x.equals(y)返回truey.equals(z)返回true,那么x.equals(z)应该返回true

  • 而在实践中,不同类型(不同类别)几乎不可能满足这个标准。除非您控制这两个类并且“非常小心”它们的实现方式。 (3认同)