Недавно я столкнулся с интересным поведением. Кажется, что если я переопределяю .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;
}
Почему не выясняется, какую версию функции вызывать на основе типа параметра?