此声明中原始类型和泛型类型之间有什么区别

时间:2015-06-01 10:22:29

标签: java

此声明中的原始类型和泛型类型之间有什么区别

List<Integer> list1 = new ArrayList<>();

List<Integer> list2 = new ArrayList();

对于这些声明,我无法做到

list1.add("hello");
list2.add("hello");

所以差异在哪里

另一方面,第一个声明中尖括号的好处是什么

1 个答案:

答案 0 :(得分:1)

当您说ArrayList<>(),时,尖括号中的类型是从声明中推断出来的,因此在编译时它会解析为ArrayList<Integer>

如果省略尖括号,则赋值使用原始类型,即集合类型,不包含元素类型的任何信息。编译器没有为此赋值完成类型推断。

两行都不会编译:

list1.add("hello")
list2.add("hello")

因为list1list2变量都声明为ArrayList<String>

指定<>的重点是ArrayList()ArrayList<String>的赋值应生成未经检查的赋值的编译器警告,因为编译器无法验证原始类型=符号右侧的集合仅包含Integer个。在像您这样的简单情况下,您可以直观地控制代码的正确性。但考虑一个更复杂的情况:

ArrayList rawList = new ArrayList();
rawList.add("one");

ArrayList<Integer> list = rawList;

在这里,您可以通过将包含String的原始列表分配给仅应包含Integer的类型化列表变量来中断通用系统。编译器未经检查的分配警告就派上用场了。