ブリッジメソッド(2)

櫻庭さんから、Eclipseでコンパイルされたものは、JDKと異なるというコメントをいただきましたので調べてみました。Eclipseでコンパイルされたものをjavapで調べて見ると次のようになりました。

C:\Users\Yoshiki Shibata\workspace\bridgemethod\bin>javap C
Compiled from "C.java"
class C extends java.lang.Object{
C();
C dup();
public java.lang.String toString();
}

C:\Users\Yoshiki Shibata\workspace\bridgemethod\bin>javap D
Compiled from "D.java"
class D extends C{
D();
D dup();
public java.lang.String toString();
C dup();
}

C:\Users\Yoshiki Shibata\workspace\bridgemethod\bin>javap E
Compiled from "E.java"
class E extends D{
E();
E dup();
public java.lang.String toString();
D dup();
}
この場合、次のコードを実行しても正しくクラスEtoStringメソッドが呼び出されます。


class CovariantReturnType {
public static void main(String[] args) {
C c = new E();
C dup = c.dup();
System.out.println(dup);
}
}
この場合、c.dup()では、クラスDC dup();が呼ばれて、それがD dup();を呼び出すのですが、そのメソッドはクラスEでオーバーライドされているため、クラスED dup();を呼び出します。クラスED dup();は、E dup();を呼び出すという次第のようです。

この記事へのコメント

この記事へのトラックバック