【发布时间】:2010-09-23 12:27:37
【问题描述】:
我最近遇到了一个有趣的行为。似乎如果我重写 .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;
}
为什么不根据参数的类型确定要调用哪个版本的函数?
【问题讨论】:
标签: java overloading