Lorsque le remplacement est égal à Java, pourquoi ne pas utiliser un paramètre autre que Object?

Je suis tombé sur un problème intéressant récemment. Il semble que, si je remplace .equals() prend un paramètre autre que l'Objet, il n'est pas appelée. Quelqu'un peut-il m'expliquer pourquoi ce qui se passe? Il semble violer ma compréhension du polymorphisme programmation orientée objet, mais peut-être que je suis absent quelque chose.

Ici est beaucoup plus simple de code qui montre ce que je vois:

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)));
  }
}

Lorsque cela est exécuté, il affiche "Contains 3? false". Il ressemble à la equals(Object) la fonction est appelée, même si il y a un autre qui serait à l'œuvre. Par contre, si j'écris est égal à l'instar de ce que le code fonctionne comme prévu:

public boolean equals(Object o) {
  if(!(o instanceof MyClass))
    return false;
  MyClass mc = (MyClass)o;
  return x == mc.x;
}

Pourquoi n'est-il pas de trouver la version de la fonction à appeler en fonction du type du paramètre?

source d'informationauteur Kip | 2008-11-21