我注意到以下代码在使用java spec 1.7在eclipse中编译时有效,但不适用于1.6。
HashMap<String, String> hashMap = new HashMap<>();
我想要一个解释,但是这个语法以及为什么它适用于1.7。
答案 0 :(得分:20)
JDK 1.6中不允许使用new HashMap<>()
(称为菱形语法),因为它仅在Java SE 7中引入。
在 Type Inference for Generic Instance Creation 中查找Highlights of Technology Changes in Java SE 7。
我想要一个解释,但是这个语法以及为什么它适用于1.7。
以下是来自Oracle itself的解释(略微改编):
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
的类型{{1}}。
答案 1 :(得分:11)
在Java SE 7中,您可以使用一组空类型参数(&lt;&gt;)替换构造函数的参数化类型:
Map<String, List<String>> myMap = new HashMap<>();
在Java SE 6中,它必须以这种方式完成:
Map<String, List<String>> myMap = new HashMap<String, List<String>>();
答案 2 :(得分:4)
因为它是JDK 1.7(Diamond运算符)的增强,所以必须在类和构造函数HashMap<String, String> hashMap = new HashMap<String, String>();
上指定泛型类型
答案 3 :(得分:2)
它正在使用1.7中引入的diamond operator。
答案 4 :(得分:1)
您不能使用在JDK 1.7中使用的相同语法对于JDK 1.6