3

次のコードの断片があります。

class BaseClass {
    public Integer getX() {
        return 5;
    }
}

class InheritedClass extends BaseClass implements Interface {
}

interface Interface {
    public Number getX();
}

public class Test5 {
    public static void main(String[] args) throws Exception {
        System.out.println(InheritedClass.class.getMethod("getX").getReturnType());
    }
}

java.lang.NumberBaseClass のgetXメソッドが を返すため、このコードはを返します。これは私には非常に奇妙ですjava.lang.Integer。そして最も興味深いのは、BaseClassInterface を実装する場合、返される型は java.lang.Integer であるということです... これは正常な動作ですか?

4

4 に答える 4

2

これが私が思うことです。

の拡張BaseClassと実装を同時に行うことで、サブクラスは次の 2 つのメソッドInterfaceを提供することを約束します。getX()

public Integer getX();
public Number getX();

戻り値の型をオーバーロードできないため、メソッドは 1 つしか存在できません。さらに、その戻り値の型はnot でなければなりませNumberInteger(後者を前者にキャストできますが、その逆はできないため)。

上記のすべてを調整するために、コンパイラは で次のメソッドを自動的に生成しますInheritedClass

  public java.lang.Number getX();
    Code:
       0: aload_0       
       1: invokevirtual #22                 // Method getX:()Ljava/lang/Integer;
       4: areturn       

ご覧のとおり、メソッド in の署名がありますが、 (暗黙的なアップキャストを使用して) Interfacein メソッドに自動的に委任されます。BaseClass

この自動生成されたメソッドは、リフレクション コードが取得するものです。

于 2013-03-07T15:24:22.740 に答える
1

はい、これは正常です。

  • IntegerのサブクラスですNumber
  • Java 5.0 では、Java の派生クラスまたはインターフェイス実装メソッドが、スーパークラスまたはインターフェイスで宣言された戻り値の型のサブクラスを返すことは問題ありません。これは、戻り型の共分散と呼ばれます。
  • InheritedClassを実装しているため、そのインターフェイスからInterfaceの戻り値の型getX、つまり が使用されますNumber
于 2013-03-07T15:16:59.607 に答える
0

JLS の関連セクションは§8.4.8.4です。

クラスは、オーバーライドと同等のシグネチャを持つ複数のメソッドを継承することができます ( §8.4.2 )。

継承されたメソッドの 1 つがabstract... ではない場合abstract、そのメソッドはそれを継承するクラスに代わって他のすべてのメソッドをオーバーライドし、したがって実装すると見なされます。

ここで検討している 2 つの方法は次のとおりです。

  • public Integer getX();
  • public abstract Number getX();

BaseClass.getXは ではなく、abstract戻り型置換可能(IntegerのサブクラスNumber) であるためInterface.getXBaseClass.getXをオーバーライドするために選択されますInterface.getX

それはあなたが見ている結果ではないので、これは奇妙です。public Number getX()ただし、 でメソッドを定義しようとするInheritedClassと、上記と一致するエラーが発生します。

于 2013-03-07T15:44:15.573 に答える
-1

これは、Generics を含む Java フレームワーク 1.6 の機能です。Integer と Double は Number のサブタイプです。

于 2013-03-07T15:27:25.180 に答える