ブリッジメソッド(2) [Java]
櫻庭さんから、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(); }
E
のtoString
メソッドが呼び出されます。この場合、class CovariantReturnType { public static void main(String[] args) { C c = new E(); C dup = c.dup(); System.out.println(dup); } }
c.dup()
では、クラスD
のC dup();
が呼ばれて、それがD dup();
を呼び出すのですが、そのメソッドはクラスE
でオーバーライドされているため、クラスE
のD dup();
を呼び出します。クラスE
のD dup();
は、E dup();
を呼び出すという次第のようです。
2011-07-16 09:10
nice!(0)
コメント(0)
トラックバック(0)
コメント 0