10

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

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

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

4

5 回答 5

21

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的正式类型参数的类型。它推断此泛型类的构造函数的形式类型参数 的类型。XMyClass<X>StringT

于 2013-05-17T14:59:13.310 回答
14

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

Map<String, List<String>> myMap = new HashMap<>();

在 Java SE 6 中必须这样做:

Map<String, List<String>> myMap = new HashMap<String, List<String>>();

更多细节...

于 2013-05-17T14:59:38.917 回答
4

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

于 2013-05-17T14:59:37.603 回答
2

它使用的是 1.7 中引入的菱形运算符。

于 2013-05-17T14:59:21.583 回答
1

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

于 2013-05-17T15:00:57.033 回答