次のコードは、Eclipse で Java 仕様 1.7 を使用してコンパイルすると機能しますが、1.6 では機能しません。
HashMap<String, String> hashMap = new HashMap<>();
説明が欲しいのですが、この構文と 1.7 で機能する理由です。
(new HashMap<>()
ダイヤモンド構文と呼ばれる) は、Java SE 7 でのみ導入されたため、JDK 1.6 では許可されていません。
Java SE 7 のテクノロジー変更点のハイライトで、汎用インスタンス作成の型推論を探してください。
説明が欲しいのですが、この構文と 1.7 で機能する理由です。
これは、 Oracle自体からの説明です(わずかに調整されています):
Java SE 7 より前のリリースのコンパイラは、ジェネリック メソッドと同様に、ジェネリック コンストラクターの実際の型パラメーターを推論できます。ただし、Java SE 7 のコンパイラは、ひし形 (
<>
)を使用すると、インスタンス化されるジェネリック クラスの実際の型パラメーターを推測できます。Java SE 7 以降で有効な次の例を検討してください。
class MyClass<X> {
<T> MyClass(T t) {
// ...
}
}
MyClass<Integer> myObject = new MyClass<>("");
この例では、コンパイラはジェネリック クラスの仮型パラメータの型を推測します。このジェネリック クラスのコンストラクターの仮型パラメーターの型を推測します。
Integer
X
MyClass<X>
String
T
Java SE 7 では、コンストラクターのパラメーター化された型を空の型パラメーターのセット (<>) に置き換えることができます。
Map<String, List<String>> myMap = new HashMap<>();
Java SE 6 では、次のようにする必要がありました。
Map<String, List<String>> myMap = new HashMap<String, List<String>>();
これは JDK 1.7 (Diamond オペレーター) の機能拡張であるため、クラスとコンストラクターでジェネリック型を指定する前にHashMap<String, String> hashMap = new HashMap<String, String>();
1.7で導入されたダイヤモンド演算子を使用しています。
JDK 1.7 で使用したものと同じ構文を JDK 1.6 で使用することはできません。