我只是偶然发现编译器对这两个术语的处理方式不同。当我输入:
LinkedList<String> list = new LinkedList();
我收到有关原始类型的编译器警告。然而:
LinkedList<String> list = new LinkedList<>();
删除警告。在我看来,这两个语句的含义基本相同(即创建一个没有指定对象类型的新 LinkedList)。那么为什么编译器允许空泛型呢?这里有什么区别?
这些陈述根本不意味着同样的事情。
第一条语句尝试将未类型化的类型LinkedList
放入已声明的泛型中LinkedList<String>
并适当地引发警告。
第二条语句在 Java 1.7 及以后版本中有效,它使用类型推断通过使用声明类型的类型参数来猜测类型参数。此外,有时这可以在方法调用中使用。然而,它并不总是有效。
有关更多信息,请参阅此页面。
它是 Java 7 中的菱形运算符,可帮助您节省再次编写类型。在 Java 7 中,这等效于声明左侧使用的同一个泛型类型参数。所以初始化是类型安全的,不会发出警告。
使用 LinkedList<>,您可以使用来自 java 7 的新菱形运算符。
Diamod 运算符使用行左侧设置的通用值。
在 Java 6 中,这不起作用!
然而,菱形运算符允许将赋值的右侧定义为真正的泛型实例,具有与左侧相同的类型参数......而无需再次键入这些参数。它允许您以与使用原始类型几乎相同的努力来保持泛型的安全性。
我认为要理解的关键是原始类型(没有 <>)不能被视为与泛型类型相同。当你声明一个原始类型时,你没有得到泛型的任何好处和类型检查。您还必须记住,泛型是 Java 语言的通用部分……它们不仅仅适用于 Collections 的无参数构造函数!
Backword 兼容性(与遗留代码互操作)是 java 允许上述签名的原因。泛型只是编译时语法。在运行时“所有通用”语法将被删除。您将只查看是否反编译任何类文件。阅读本文档。
LinkedList list = new LinkedList();