为什么新的HashMap 在JDK 1.6中产生错误而不是1.7

我注意到以下代码在使用java spec 1.7在eclipse中编译时有效,但不适用于1.6。

HashMap hashMap = new HashMap(); 

我想要一个解释但是这个语法以及为什么它适用于1.7。

JDK 1.6中不允许使用new HashMap<>() (称为菱形语法),因为它仅在Java SE 7中引入。

在Java SE 7中查找技术更改重点中的 通用实例创建类型推断 。

我想要一个解释但是这个语法以及为什么它适用于1.7。

以下是来自Oracle本身的解释(略微改编):

Java SE 7之前版本的编译器能够推断通用构造函数的实际类型参数,类似于generics方法。 但是, 如果使用菱形( <> ,Java SE 7中的编译器可以推断正在实例化的generics类的实际类型参数。 请考虑以下示例,该示例对Java SE 7及更高版本有效:

 class MyClass {  MyClass(T t) { // ... } } 

 MyClass myObject = new MyClass<>(""); 

在此示例中,编译器为通用类MyClass的forms类型参数X 推断类型Integer 。 它推断出此generics类的构造函数的forms类型参数T的类型String

在Java SE 7中,您可以使用一组空的类型参数(<>)替换构造函数的参数化类型:

 Map> myMap = new HashMap<>(); 

在Java SE 6中,它必须以这种方式完成:

 Map> myMap = new HashMap>(); 

更多细节…

因为它是JDK 1.7(Diamond运算符)的增强,所以必须在类和构造函数HashMap hashMap = new HashMap();上指定generics类型HashMap hashMap = new HashMap();

它使用的是1.7中引入的钻石操作员 。

您不能使用在JDK 1.7中使用的相同语法对于JDK 1.6