0
public class StrangeParamMethod {

    static void f(ArrayList<String> list){};

    public static void main(String... args){
        ArrayList<String> list = new ArrayListGenerator().list(); //assigns without problems
        f(new ArrayListGenerator().list());  //compile error
    }
}

class ArrayListGenerator   {
    <K> ArrayList<K> list(){
        return new ArrayList<K>();
    }
}

指摘された文字列でコンパイル エラーが発生する理由を教えてください。文字列で問題は発生しません。そのコンパイルエラーを解決する方法は知っていますが、この特定のケースでなぜそのような違いがあるのか​​ 知りたいです。

PS私はコンパイルエラーが解決することを知っていますf(new ArrayListGenerator().<String>list());

4

2 に答える 2

0

型パラメーターなしでジェネリック メソッドを呼び出すと、生の型が使用されます (型推論なし)。型推論は、コード行で型が指定されている場合に機能します (最初のケース)。

もちろん、<String>メソッド名の前に置くことでlist明確になり、エラーを防ぐことができます:

    f(new ArrayListGenerator().<String>list());  
于 2013-05-30T09:48:48.297 に答える
0

Oracle のコンパイラ チームは、2 番目の状況ではわざわざ型推論を実装しませんでしたが、最初の状況 (式が割り当てられている変数から型を推論できる場合) では実装したためです。

Java 8 には型推論の点で大きな改良が加えられているため、Java 8 コンパイラーでコンパイルされたとしても驚かないでしょう。

于 2013-05-30T09:45:45.347 に答える