编译器不会 推断 类型,因为您正在实例化 raw ArrayList
。但是它足够聪明,可以警告您在使用此(原始)对象时可能会出现问题。
值得一提的是此警告背后的原因。由于类型擦除,<Integer>
有关List
变量的参数信息()将在运行时完全消失,此时变量将保留type元素Object
。考虑以下代码段:
List rawList = new ArrayList(); //raw list
rawList.add(new String("hello"));
rawList.add(new Double(12.3d));
List<Integer> intList = rawList; // warning!
该代码段将编译,但不会生成任何警告。有一个原始列表(rawList
),您可以添加任何非原始类型到列表中,包括String
,Double
等等。但是这种分配收集到一个列表,该列表指定举行时 整数,那么这是一个问题。在运行时,ClassCastException
当您尝试从中获取某些元素时会得到aintList
,这应该是Integer
,但实际上是a String
或其他。
长话短说- 将原始类型与泛型混用!
在您的情况下,如果您使用菱形,则编译器 会推断出类型:
List<Integer> list = new ArrayList<>(); //¯\_(ツ)_/¯
↑↑