Самый известный пример путаницы, вызванной вопросом поднимаешь включает equals
:
public class Banana {
private final double weight;
public boolean equals(Banana that) { return this.weight == that.weight; }
}
Многие люди думают, что это достоверный переопределение equals
, но это на самом деле просто другой метод, не связанный с Object#equals(Object)
и не будет участвовать в сравнительном сравнении.
Это одна из известных ловушек системы типов Java, поэтому будьте осторожны, чтобы все исправить.
Чтобы запутать дело дальше, вы являетесь разрешено специализироваться типа возвращаемого (типа возвращаемого значения ковариантен):
public abstract class FruitTree {
public abstract Object getFruit();
}
public class BananaTree {
...
@Override public Banana getFruit() { return this.bananas.iterator().next(); }
}
Обратите внимание, что понятие сигнатуры методы не включает возвращение тип. Подпись метода является ключевой концепцией в механизме разрешения метода статического (компиляции) времени, и каждая подпись является отдельной точкой диспетчеризации динамических методов.
Java 6 имеет аннотацию Override, чтобы сделать ссылку явной. Если вы поместите (at) Override в подкласс, он скажет, что он не был переопределен. –