此声明中的原始类型和泛型类型之间有什么区别
List<Integer> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList();
对于这些声明,我无法做到
list1.add("hello");
list2.add("hello");
所以差异在哪里
另一方面,第一个声明中尖括号的好处是什么
答案 0 :(得分:1)
当您说ArrayList<>(),
时,尖括号中的类型是从声明中推断出来的,因此在编译时它会解析为ArrayList<Integer>
。
如果省略尖括号,则赋值使用原始类型,即集合类型,不包含元素类型的任何信息。编译器没有为此赋值完成类型推断。
两行都不会编译:
list1.add("hello")
list2.add("hello")
因为list1
和list2
变量都声明为ArrayList<String>
。
指定<>
的重点是ArrayList()
到ArrayList<String>
的赋值应生成未经检查的赋值的编译器警告,因为编译器无法验证原始类型=
符号右侧的集合仅包含Integer
个。在像您这样的简单情况下,您可以直观地控制代码的正确性。但考虑一个更复杂的情况:
ArrayList rawList = new ArrayList();
rawList.add("one");
ArrayList<Integer> list = rawList;
在这里,您可以通过将包含String
的原始列表分配给仅应包含Integer
的类型化列表变量来中断通用系统。编译器未经检查的分配警告就派上用场了。