ブリッジメソッド
社内で開催している「プログラミング言語Java」研修の受講生の一人から、拙著『Java 2 Standard Edition 5.0 Tiger』のp.25のjavapの出力が実際には違うという指摘を2度も受けたので、確認してみました。内容は、次の通りです。
次のように3つのクラス
OracleからリリースされているJDKのjavac以外のコンパイラで、クラス
次のように3つのクラス
C、D、Eがあります。それで、この3つのクラスをコンパイルします。
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";
}
}
javacのバージョンは、1.6.0_21と表示されています。次に、javapコマンドでクラスEを調べます。
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>
本に書いてあるように、3つの
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();
}
dup()メソッドがあるのが分かります。受講生の主張は、2つしか表示されないというものでしたが、一体どんな環境で確認したのか疑問に残ります。OracleからリリースされているJDKのjavac以外のコンパイラで、クラス
Eのdup()が2つしか生成されないものがあるのでしょうか?
この記事へのコメント
JDKのjavacとEclipseのjavacは微妙に仕様が異なっているのでいやですね。