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

Men*_*los 9 java generics

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

HashMap<String, String> hashMap = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)

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

acd*_*ior 20

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

寻找的类型推断通用实例创建技术变化在Java SE 7的亮点.

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

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

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

class MyClass<X> {
  <T> MyClass(T t) {
    // ...
  }
}
Run Code Online (Sandbox Code Playgroud)

 

MyClass<Integer> myObject = new MyClass<>("");
Run Code Online (Sandbox Code Playgroud)

在这个例子中,编译器推断类型Integer为正式类型参数X,泛型类的MyClass<X>.它推断出这个泛型类的构造函数String的形式类型参数的类型T.


Ada*_*ion 11

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

Map<String, List<String>> myMap = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)

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

Map<String, List<String>> myMap = new HashMap<String, List<String>>();
Run Code Online (Sandbox Code Playgroud)

更多细节...