new ArrayList<String>()和new ArrayList()之间的区别

5
这两个声明有什么区别?
new ArrayList<String>();
new ArrayList();

他们都能用,但第二个会返回一个警告。我不明白为什么。
我理解 ArrayList<String> arrArrayList arr 的区别,前者启用了类型检查控制。但是 new ArrayList<String>()new ArrayList() 有什么区别吗?在实现层面上有什么不同?在控制方面会失去什么?

9
如果你使用 <> 菱形操作符,像这样 List<String> strings = new ArrayList<>();,它会检测出类型。 - GhostCat
3个回答

3

在Java 7中它可以自动检测类型,但您需要使用菱形运算符(Diamond Operator)

ArrayList<String> arr = new ArrayList<>();

这基本上是对第一行的语法糖。没有钻石操作符,它就是一个原始类型(非参数化泛型类型)。原始类型存在是为了与不支持泛型的旧Java版本兼容,但在使用时会引发警告。


2
尽管如此,它并没有回答提出的问题:"ArrayList<String> arr = new ArrayList<String>()ArrayList<String> arr = new ArrayList();之间有什么区别?"。 - Kevin Cruijssen
@kapep 我明白了,但我还不明白在编译器检查和编码 ArrayList<String> arr = new ArrayList(); 方面会失去什么。我的意思是,如果我以这种方式编码,做 arr.add(arr.get(0)) 不会返回错误。 - zer0uno

1

如前所述,可以使用<>钻石操作符解决此问题。

但是这样做有原因。您必须记住,泛型是在集合类之后添加的。而且想法是泛型不应该破坏现有的源代码。Sun 不希望客户在编译大量现有代码时突然失败,使用未泛型化的列表...

因此,Java 编译器必须接受像... = new ArrayList()这样的代码。

但是要注意的是,这种声明会创建所谓的“原始类型”。

如果可能,您永远不应该使用原始类型。这就是为什么 Eclipse 和 javac 给出警告的原因 - 为了提醒您永远不要创建原始类型。


0
你需要知道,在运行时,所有的泛型都被擦除了,因此所有的ArrayList都是相同的类型,无论你放入什么类型在 <> 中。
因此,尽管第二个语句是可能的(由于在泛型出现之前的历史原因),但应该避免使用它,因为它会混淆类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接