次のサンプルでは、Foo.create()
の最初の呼び出しの汎用引数をFoo.test()
に推測することはできますが、2番目の呼び出しではできません。私は javacが引数として使用する関数の汎用型引数を推論できないのはなぜですか?
public class Nonsense {
public static class Bar {
private static void func(Foo<String> arg) { }
}
public static class Foo<T> {
public static <T> Foo<T> create() {
return new Foo<T>();
}
private static void test() {
Foo<String> foo2 = Foo.create(); // compiles
Bar.func(Foo.create()); // won't compile
Bar.func(Foo.<String>create()); // fixes the prev line
}
}
}
(コンパイルエラーがタイプNonsense.BarのメソッドFUNC(Nonsense.Foo)は引数(Nonsense.Foo)には適用されませんである)は、Java 6
を使用しています。注:私は、test()の3行目で修正できますが、コンパイラのエラーは、コンパイラがその型を推論できないような特定の制限があるかどうか不思議です。それはのように私にはここにそれのための十分な文脈があると私にはが表示されます。
"それは十分スマートではありません。" –
@ルイス - それは十分にスマートにすることはできませんが、私はまだ、理由を考え出していないと考えられます。 – bacar
@bacar:それはおそらく十分にスマートになる可能性があります。 –