Java不参数化集合

时间:2013-12-25 20:35:21

标签: java

所以我注意到做了类似的事情:

LinkedList list = new LinkedList();

给你一个编译器的警告,所以我总是被告知正确的方法是:

LinkedList<Integer> list = new LinkedList<Integer>();

但我注意到了

LinkedList<Integer> list = new LinkedList<>();

也没有发出警告,虽然我不太明白为什么。有人可以向我解释最后两个例子之间的区别,如果一个人比另一个例子更可取,无论是风格还是实际上?

3 个答案:

答案 0 :(得分:3)

  

钻石

     

在Java SE 7及更高版本中,您可以替换所需的类型参数   使用一组空类型调用泛型类的构造函数   参数(&lt;&gt;),只要编译器可以确定或推断出   从上下文中键入参数。这对尖括号&lt;&gt;是   非正式地称钻石。例如,您可以创建实例   Box&lt;整数&gt;以下声明:

     

盒及LT;整数&GT; integerBox = new Box&lt;&gt;();

     

有关钻石的更多信息   符号和类型推断,请参阅类型推断。

了解更多herehere

答案 1 :(得分:2)

两个

LinkedList<Integer> list = new LinkedList<Integer>();

LinkedList<Integer> list = new LinkedList<>();

是等价的。当您使用'diamond'(<>)时,编译器使用类型推断来确定您的意思类型。所以在这种情况下,因为它被分配给LinkedList<Integer>类型的变量,所以它假定这是你想要创建的(你做的)。

答案 2 :(得分:1)

您在第一种情况下遇到未经检查警告的原因是您将Collection LinkedList声明为Raw类型。术语“未选中”表示编译器没有足够的类型信息来执行必要的所有类型检查,以确保将来操作的类型安全。

然而,钻石操作员允许使用Type inference的机制将赋值的右侧定义为与左侧相同的类型参数,从而使我们的泛型安全性与定义几乎相同右侧的类型:这确实是不必要的。