汎用インスタンス生成のための型推論
コンパイラがコンテキストから型パラメータを推論できる限り、ジェネリック・クラスのパラメータを空の型パラメータ・セットに置き換えることが可能です。
// java 7
Map<String, List<String>> myMap = new HashMap<String, List<String>>();
//java7後で、コンストラクタのパラメータ化された型は型パラメータの空集合に置き換えることができる:
Map<String, List<String>> myMap = new HashMap<>();
JavaSE7では、限られた型推論しかサポートしていません。型推論は、コンストラクタのパラメータ化された型がコンテキストから明らかな場合にのみ使用できます。例えば、次の例はコンパイルできません:
List<String> list = new ArrayList<>();
list.add("A");
// 次のようにすることはできない。<br/>
list.addAll(new ArrayList<>());
//これを次のように変更すると動作する。<br/>
List<? extends String> list2 = new ArrayList<>();
list.addAll(list2);
菱形は通常メソッド呼び出しで機能しますが、菱形は主に変数宣言に使用することをお勧めします。
ジェネリッククラスと非ジェネリッククラスの型推論とジェネリックコンストラクタ
コンストラクタはジェネリッククラスでも非ジェネリッククラスでもジェネリックにすることができることに注意してください。以下の例を考えてみましょう ``` class MyClass { MyClass(T t) { // ...これは Java SE 7 以前で有効です。 ``` new MyClass("") ``` このステートメントはパラメータ化された型 MyClass のインスタンスを生成します。コンパイラはこのジェネリック・クラスのコンストラクタの形式型パラメータ T から文字列型を推測します。JavaSE7バージョンのコンパイラは、ジェネリック・メソッドと同様に、ジェネリック・コンストラクタの実際の型パラメータを推論することができます。しかし、菱形が使用されている場合、JavaSE7 のコンパイラーは、インスタンス化されるジェネリック・クラスの実際の型パラメーターを推測することができます。Java SE 7 以降に適用される次の例を考えてみましょう:
MyClass<Integer> myObject = new MyClass<>("");
この例では、コンパイラはジェネリック・クラス MyClass の正式な型パラメータ X の整数型を推論します。コンパイラは、ジェネリック・クラスのコンストラクタの形式型パラメータ T の型文字列を推論します。





