新的LinkedList<>()与新的LinkedList()有何不同

时间:2012-07-10 20:06:26

标签: java generics

我偶然发现编译器对这两个术语的处理方式不同。当我输入:

LinkedList<String> list = new LinkedList();

我收到有关原始类型的编译器警告。但是:

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

删除警告。在我看来好像两个语句基本上是相同的东西(即创建一个没有指定对象类型的新LinkedList)。为什么编译器都有空的泛型呢?这有什么区别?

4 个答案:

答案 0 :(得分:4)

它是Java 7中的钻石运算符,可以帮助您再次保存写入类型。在Java 7中,这相当于声明左侧使用的相同泛型类型参数。因此,初始化是类型安全的,不会发出警告。

答案 1 :(得分:4)

这些陈述并不意味着相同的事情。

第一个语句尝试将无类型LinkedList拟合到声明的通用LinkedList<String>中并适当地发出警告。

第二个语句,在Java 1.7以后有效,使用类型推断通过使用声明类型的类型参数来猜测类型参数。此外,有时这可以在方法调用中使用。但是,它并不总是有效。

有关详细信息,请参阅this page

答案 2 :(得分:1)

使用LinkedList&lt;&gt;,您可以使用java 7中的新Diamond Operator。

Diamod运算符使用在行左侧设置的通用值。

在Java 6中,这不起作用!

  然而,钻石操作员允许右侧的钻石操作员   赋值被定义为具有相同类型的真实通用实例   参数为左侧......无需键入这些参数   再次。它可以让你几乎保持仿制药的安全性   与使用原始类型相同的努力。

     

我认为要理解的关键是原始类型(没有&lt;&gt;)   不能像通用类型那样对待。当你申报原始   类型,你没有得到任何好处和类型检查泛型。您   还必须记住,仿制药是通用的一部分   Java语言......它们不仅适用于no-arg构造函数   收藏品!

摘自:https://stackoverflow.com/a/10093701/1281306

答案 3 :(得分:0)

Backword兼容性(与遗留代码互操作)是java允许上述签名的原因。泛型只是编译时语法。在运行时,将删除“所有通用”语法。您将看到是否解编译任何类文件。阅读此documentation

LinkedList list = new LinkedList();