会社のコミュニティサイトで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#はどうだろうか。