什么时候需要为集合指定泛型类型?

When is specifying generic types for collections necessary?

以下代码行分别编译(当然是在不同的方法中):

List<String> list = new ArrayList<String>();
List<String> list = new ArrayList<>();
List<String> list = new ArrayList();

其中一项是否比其他项更受鼓励?这些选项之间的行为有什么不同吗?

此声明形式适用于 Java 至版本 6

List<String> list = new ArrayList<String>();

此声明形式适用于 Java 版本 7+

List<String> list = new ArrayList<>();

最后对于这个版本,编译器会生成一个未经检查的转换警告,但它有效:

List<String> list = new ArrayList();

有关完整说明,请参阅此 link

<>称为菱形运算符,它根据引用变量声明确定类型。

Recommended is using diamond operator 因为这避免了类型变量的样板或重复声明,因为它从变量声明中清晰可见,同时允许类型默认为 Object class 类型(如果未指定)。

除了 List<String> list = new ArrayList(); 发出警告或根本不被视为良好做法外,以上三项均有效。

我的想法: List<String> list = new ArrayList(); 从那个角度来看也可能是一个有效的声明,但它默认为对象类型的数组列表(这就是 Java是)。准确地说:

if you don't specify a type, it defaults to Object type