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

时间:2013-05-17 14:58:07

标签: java generics

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

HashMap<String, String> hashMap = new HashMap<>();

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

5 个答案:

答案 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>>();

More details...

答案 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