我注意到以下代码在使用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)