あなたが提起した問題によって引き起こされる混乱の最も有名な例は次のequals
とおりです。
public class Banana {
private final double weight;
public boolean equals(Banana that) { return this.weight == that.weight; }
}
多くの人は、これは の有効なオーバーライドだと考えていますがequals
、実際には とは関係のない別のメソッドObject#equals(Object)
であり、equals 比較には関与しません。
これは、Java の型システムの既知の落とし穴の 1 つなので、正しく行うように十分注意してください。
さらに混乱させるために、戻り値の型を特殊化することが許可されています (戻り値の型はcovariantです)。
public abstract class FruitTree {
public abstract Object getFruit();
}
public class BananaTree {
...
@Override public Banana getFruit() { return this.bananas.iterator().next(); }
}
メソッド シグネチャの概念には、戻り値の型は含まれないことに注意してください。メソッド シグネチャは、静的 (コンパイル時) メソッド解決のメカニズムにおける重要な概念であり、各シグネチャは動的メソッド ディスパッチの個別のポイントです。