ページ

2009年4月28日

Javaのメソッドシグネチャがすごい件

相変わらずJavaラブな僕ですが、Javaで知らないことは沢山あります。次のコードを見てください。

import java.util.*;
public TestClass {
public List get(String s) {
return null;
}
public Map get(String s) {
return null;
}
}
このコードはコンパイルが通らないことはJavaを初めた人でもわかります。さて、次のコードはどうでしょうか?ジェネリックを使っていて、引数が微妙に違いますが、コンパイルすると単なるCollectionになります。
import java.util.*;
public TestClass {
public List get(Collection<Integer> s) {
return null;
}
public Map get(Collection<String> s) {
return null;
}
}
これ、OpenJDKだとコンパイルエラーになりますが、SunのJDKだとコンパイルはとおります。javapでみると、戻り値の型を含めてメソッドのシグネチャとして処理しているよう。
こんな言語仕様って聞いたことないし、訳がわかりません。そもそも、戻り値まで含めてメソッドの呼び出しを決定するって僕の知る限りJavaが初めての言語です。ちなみに、僕の知る言語とは、C/C++, Python/Ruby/Perl/JavaScript/PHPとかのスクリプト言語、あと、忘れた。

これ、今日UbuntuをアップデートしてデフォルトのJDKがOpenJDKになってたまたま見つかったんですが。続きは「ありえるえりあ」で弟子たちが書くでしょう。

0 件のコメント: