まず第一に: Java 7 を使用していない限り、ダイヤモンド<>
はその Java バージョンでのみ導入されているため、これはすべて機能しません。
また、この回答は、読者がジェネリックの基本を理解していることを前提としています。そうでない場合は、チュートリアルの他の部分を読み、それらを理解してから戻ってきてください。
ひし形は、実際には、コンパイラが独自に型を見つけることができる場合に、ジェネリック型情報を繰り返す必要がないためのショートカットです。
最も一般的な使用例は、変数が初期化された同じ行で定義されている場合です。
List<String> list = new ArrayList<>(); // is a shortcut for
List<String> list = new ArrayList<String>();
この例では大きな違いはありませんが、一度理解すれば大きな機能強化にMap<String, ThreadLocal<Collection<Map<String,String>>>>
なります(注:このような構造を実際に使用することはお勧めしません!)。
問題は、ルールがそこまでしか進んでいないことです。上記の例では、どのタイプを使用する必要があるかは明らかであり、コンパイラと開発者の両方が同意しています。
この行で:
list.addAll(new ArrayList<>());
明らかなようです。少なくとも開発者は、型が であるべきであることを知っていますString
。
ただし、 の定義Collection.addAll()
を見ると、パラメーターの型が であることがわかりますCollection<? extends E>
。
これは、addAll
が の型を拡張する未知の型のオブジェクトを含むコレクションを受け入れることを意味しますlist
。addAll
これはaList<Integer>
を aに変換できることを意味するので良いのですがList<Number>
、型の推論が難しくなります。
実際、JLS によって現在レイアウトされている規則内では、型推論が機能しなくなります。状況によっては、ルールを拡張して機能させることができると主張することもできますが、現在のルールはそれを行わないことを暗示しています。