ブリッジメソッド

社内で開催している「プログラミング言語Java」研修の受講生の一人から、拙著『Java 2 Standard Edition 5.0 Tiger』のp.25のjavapの出力が実際には違うという指摘を2度も受けたので、確認してみました。内容は、次の通りです。

次のように3つのクラスCDEがあります。

class C {
C dup() {
return new C();
}
public String toString() {
return "instance of class C";
}
}

class D extends C {
D dup() { // 共変戻り値型
return new D();
}
public String toString() {
return "instance of class D";
}
}

class E extends D {
E dup() {
return new E();
}
public String toString() {
return "instance of class E";
}
}
それで、この3つのクラスをコンパイルします。

C:\Users\Yoshiki Shibata\Desktop\ftp\code\code\024>javac -version
javac 1.6.0_21

C:\Users\Yoshiki Shibata\Desktop\ftp\code\code\024>javac E.java

C:\Users\Yoshiki Shibata\Desktop\ftp\code\code\024>
javacのバージョンは、1.6.0_21と表示されています。次に、javapコマンドでクラスEを調べます。

C:\Users\Yoshiki Shibata\Desktop\ftp\code\code\024>javap E
Compiled from "E.java"
class E extends D{
E();
E dup();
public java.lang.String toString();
D dup();
C dup();
}
本に書いてあるように、3つのdup()メソッドがあるのが分かります。受講生の主張は、2つしか表示されないというものでしたが、一体どんな環境で確認したのか疑問に残ります。

OracleからリリースされているJDKのjavac以外のコンパイラで、クラスEdup()が2つしか生成されないものがあるのでしょうか?

この記事へのコメント

2011年07月15日 13:39
EclipseのjavacだとC dup();がないようです。

JDKのjavacとEclipseのjavacは微妙に仕様が異なっているのでいやですね。

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