3
public class Superclass {

   void method(Object a){
   }
}


public class Subclass extends Superclass {

    void method(String a){
    }
}

上記のクラスでは、スーパークラスのメソッドには Object 型のパラメーターがあり、サブクラスには String 型のパラメーターがあります。String は Object のサブクラスです。私の質問は、この場合メソッドはオーバーライドされますか?

4

2 に答える 2

4

あなたが提起した問題によって引き起こされる混乱の最も有名な例は次の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(); }
}

メソッド シグネチャの概念には、戻り値の型は含まれないことに注意してください。メソッド シグネチャは、静的 (コンパイル時) メソッド解決のメカニズムにおける重要な概念であり、各シグネチャは動的メソッド ディスパッチの個別のポイントです。

于 2013-05-13T09:36:29.163 に答える