kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

Java Quiz

 会社のコミュニティサイトでJavaの偉い人がJavaの仕様に引っかけた問題を毎日出してくれている。この問題を考えるのが結構楽しい。Javaは門外漢なので、特に最新の仕様は知らないし、しばしば間違えているけれど(^^;。
 今日の問題は継承関係にまつわるJ2SE 1.4.2とJava5の話。試しにコンパイルしてみると、確かにJ2SE 1.4.2ではコンパイルエラーになるけれど、JDK5ではコンパイルできる。

  class A {
    public A foo() {
        console.out("A");
        return this;
    }
  }
  class B extends A
    public B foo() {
        console.out("b");
        return this;
    }
  }
  static main() {
     A p1 = new A();
     B p2 = new B();
     A ex1 = p1.foo();
     B ex2 = p2.foo();
  }

 こんな感じ。記憶だけで書いているので、コンパイルは通りません。イメージだけつかんでください。
 これをJDK1.4.2でコンパイルするとエラー(型が曖昧)になるけれど、JDK5ではOK。ちなみにC++に書き直してみるとJDK5と同じくOK(結果も同じ)。なんでこうなったのかな?C++と同じにしてくれ!という意見でもあったのかな。C++と同じ方が良さそうに見えるけど…。C#はどうだろうか。