4

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

LinkedList<String> list = new LinkedList();

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

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

删除警告。在我看来,这两个语句的含义基本相同(即创建一个没有指定对象类型的新 LinkedList)。那么为什么编译器允许空泛型呢?这里有什么区别?

4

4 回答 4

5

这些陈述根本不意味着同样的事情。

第一条语句尝试将未类型化的类型LinkedList放入已声明的泛型中LinkedList<String>并适当地引发警告。

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

有关更多信息,请参阅此页面

于 2012-07-10T20:12:49.373 回答
4

它是 Java 7 中的菱形运算符,可帮助您节省再次编写类型。在 Java 7 中,这等效于声明左侧使用的同一个泛型类型参数。所以初始化是类型安全的,不会发出警告。

于 2012-07-10T20:10:40.257 回答
1

使用 LinkedList<>,您可以使用来自 java 7 的新菱形运算符。

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

在 Java 6 中,这不起作用!

然而,菱形运算符允许将赋值的右侧定义为真正的泛型实例,具有与左侧相同的类型参数......而无需再次键入这些参数。它允许您以与使用原始类型几乎相同的努力来保持泛型的安全性。

我认为要理解的关键是原始类型(没有 <>)不能被视为与泛型类型相同。当你声明一个原始类型时,你没有得到泛型的任何好处和类型检查。您还必须记住,泛型是 Java 语言的通用部分……它们不仅仅适用于 Collections 的无参数构造函数!

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

于 2012-07-10T20:11:07.150 回答
0

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

LinkedList list = new LinkedList();
于 2012-07-10T20:07:12.983 回答