最近、興味深い行動に出くわしました。.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;
}
パラメーターの型に基づいて、関数のどのバージョンを呼び出すかを判断しないのはなぜですか?