<< 2009/02/03 | Home | 2009/02/05 >>
PR: 転職    転職    合宿免許    漫画    シルバー    ブライダルエステ    墓地・霊園    葬式   

ジェネリックメソッド

Collections.emptyList()って、ジェネリックメソッドになっているけど、

class Test {
void foo(List<Integer> l) {}

void bar() {
foo(Collections.emptyList());
}
}

これはエラーだ。

E:\tmp>javac Test.java
Test.java:8: foo(java.util.List<java.lang.integer>) (Test 内) を (java.util.List<java.lang.object>) に適用できません
foo(Collections.emptyList());
^
エラー 1 個

自分の理解では、引数にクラストークンを渡してやらないと、ジェネリックメソッドの型パラメータは、決定されないので、この動作は納得が行く。でも、そうすると無引数のemptyList()が、何でジェネリックメソッドになっているんだろうか。と思ったら、以下は、コンパイルできる。警告も出ない。

    void bar() {
List<Integer> e = Collections.emptyList();
foo(e);
}

なんだこりゃ。ローカル変数に代入する時は、大丈夫だけど、メソッド引数の場合はダメなの?

このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8