警告: Raw use of parameterized class ‘ArrayList‘

  • Post author:
  • Post category:其他




代码

@Test
public void test2(){
    ArrayList list2 = new ArrayList();  //  此处报警
    list2.add(123);
    list2.add(456);
    list2.add("AA");
    list2.add(new Person("Tom", 12));
    list2.add(789);

    System.out.println(list2);
}



原因

使用原始类型(没有类型参数的泛型)是合法的,但是你永远不应该这样做。如果使用原始类型,就会失去泛型的安全性和表现力。 既然你不应该使用它们,那么为什么语言设计者一开始就允许原始类型呢?答案是:为了兼容性。Java 即将进入第二个十年,泛型被添加进来时,还存在大量不使用泛型的代码。保持所有这些代码合法并与使用泛型的新代码兼容被认为是关键的。将参数化类型的实例传递给设计用于原始类型的方法必须是合法的,反之亦然。这被称为迁移兼容性的需求,它促使原始类型得到支持并使用擦除实现泛型 。

虽然你不应该使用原始类型(如 List),但是可以使用参数化的类型来允许插入任意对象,如 List。原始类型 List 和参数化类型 List 之间的区别是什么?粗略地说,前者选择了不使用泛型系统,而后者明确地告诉编译器它能够保存任何类型的对象。虽然可以将 List 传递给 List 类型的参数,但不能将其传递给类型 List 的参数。泛型有子类型规则,List 是原始类型 List 的子类型,而不是参数化类型 List 的子类型(Item-28)。因此,如果使用原始类型(如 List),就会失去类型安全性,但如果使用参数化类型(如 List)则不会。

应该改为:

ArrayList list2 = new ArrayList<>();



版权声明:本文为qq_36256590原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。