我偶然发现编译器对这两个术语的处理方式不同。当我输入:
LinkedList<String> list = new LinkedList();
我收到有关原始类型的编译器警告。但是:
LinkedList<String> list = new LinkedList<>();
删除警告。在我看来好像两个语句基本上是相同的东西(即创建一个没有指定对象类型的新LinkedList)。为什么编译器都有空的泛型呢?这有什么区别?
答案 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构造函数 收藏品!
答案 3 :(得分:0)
Backword兼容性(与遗留代码互操作)是java允许上述签名的原因。泛型只是编译时语法。在运行时,将删除“所有通用”语法。您将看到是否解编译任何类文件。阅读此documentation。
LinkedList list = new LinkedList();