我注意到以下代码在 eclipse 中使用 java spec 1.7 编译时有效,但不适用于 1.6。
HashMap<String, String> hashMap = new HashMap<>();
我想要一个解释,但是这个语法以及它为什么适用于 1.7 。
new HashMap<>()
JDK 1.6 中不允许使用(称为菱形语法),因为它仅在 Java SE 7 中引入。
在 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 For JDK 1.6 中使用的相同语法