我最近遇到了一个有趣的行为。似乎如果我重写 .equals() 以获取 Object 以外的参数,它就不会被调用。谁能向我解释为什么会这样?这似乎违反了我对 OOP 中多态性的理解,但也许我遗漏了一些东西。
这是更简单的代码,显示了我所看到的:
public class MyClass {
private int x;
public MyClass(int n) { x = n; }
public boolean equals(Object o) { return false; }
public boolean equals(MyClass mc) { return x == mc.x; }
public static void main(String[] args) {
List<MyClass> list = new ArrayList<MyClass>();
list.add(new MyClass(3));
System.out.println("Contains 3? " + list.contains(new MyClass(3)));
}
}
当它运行时,它会打印“ Contains 3? false
”。看起来好像调用了 equals(Object) 函数,即使还有另一个可以工作。相比之下,如果我这样写 equals ,则代码按预期工作:
public boolean equals(Object o) {
if(!(o instanceof MyClass))
return false;
MyClass mc = (MyClass)o;
return x == mc.x;
}
为什么不根据参数的类型确定要调用哪个版本的函数?