Недавно я столкнулся с интересным поведением. Кажется, что если я переопределю .equals (), чтобы получить параметр, отличный от Object, он не будет вызван. Может кто-нибудь объяснить мне, почему это происходит? Кажется, это нарушает мое понимание полиморфизма в ООП, но, возможно, я что-то упускаю.
Вот гораздо более простой код, который показывает, что я вижу:
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), хотя есть и другая, которая будет работать. В отличие от этого, если я напишу «равно», код работает так, как ожидалось:
public boolean equals(Object o) {
if(!(o instanceof MyClass))
return false;
MyClass mc = (MyClass)o;
return x == mc.x;
}
Почему не выясняется, какую версию функции вызывать, основываясь на типе параметра?