【发布时间】:2018-06-12 05:56:45
【问题描述】:
我看了这么多文章,但我无法理解这两行之间的区别:
ArrayList<String> list = new ArrayList();
ArrayList<String> list = new ArrayList<String>();
我看到的唯一区别是第一行触发了“未经检查的分配”警告。
【问题讨论】:
-
如果您执行
ArrayList<String> list = new ArrayList(Arrays.asList(1,2,3));- 并且如果您打印list会发生什么?试试看。 -
我知道,但是空的构造函数调用呢?
-
您使用的是原始类型,因此编译器无法检查您的代码是否是类型安全的,因此会发出警告。这里无关紧要,但它仍然是错误的,因为它鼓励草率的编程,使用原始类型(如 Elliott 的示例所示)。它还添加了一个编译警告,您通常应该避免这种情况(至少能够轻松检测到其他严重程度更高的警告)。
-
这很简单。
new ArrayList()正在创建一个原始类型数组列表。然后,您将该原始类型分配给具有类型的引用。因此,您进行了不安全/未经检查的分配。 -
仅供参考,还有第三个选项
ArrayList<String> list = new ArrayList<>();,相当于第二个,除了the type is inferred,这意味着你不需要写两次String。