警告数组列表是原始类型。对泛型类型 ArrayList<E> 的引用应参数化

2022-09-01 08:10:05

可能的重复:
ArrayList是原始类型。对泛型类型 ArrayList<E> 的引用应参数化

为了保存一个由一个成员完成的付款的ArrayList,我想将付款ID列表更改为字符串,因此我创建了以下方法:

public String fromArraytoString(ArrayList items){
       JSONObject json = new JSONObject();
        json.put("uniqueArrays", new JSONArray(items));
        return json.toString();
           }

但是我收到以下警告:

   ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized

谁能解释一下我为什么?


答案 1

您绝对应该阅读有关Java泛型的本教程http://docs.oracle.com/javase/tutorial/java/generics/

简而言之:

许多Java类和类型(称为泛型类泛型类型),通常是集合,具有所谓的类型参数,例如in(只是任意选择的名称,其他类将其命名为或其他名称):EArrayList<E>ET

public class ArrayList<E> extends ... {

    public E get(int index) { ... }

    public boolean add(E element) { ... }

    // other methods...
}

现在,当您创建此类类的实例时,您可以定义类型参数的具体值,例如(通常可以计算为所需的任何类型):StringE

ArrayList<String> stringList = new ArrayList<String>();

从现在开始,变量的所有 s 都被“替换”,因此您只能向其添加字符串,而只能从中获取字符串。编译器会为您检查您是否没有错误地添加其他类型的对象:EStringstringList

stringList.add(Integer.valueOf(1));
// compile error - cannot add Integer to ArrayList of Strings

但是,由于泛型已添加到 Java 5 中,因此仍然可以在没有泛型的情况下编写代码以实现向后兼容性。所以你可以写:

ArrayList list = new ArrayList();

但是您失去了所有类型检查的好处。方法签名中的 s 变为简单的 s。EObject

list.add(Integer.valueOf(42)); // adding an Integer
list.add("aaa"); // adding a String

Object something = list.get(0); // unknown type of returned object, need to cast
Integer i0 = (Integer) something; // this unsafe cast works...
Integer i1 = (Integer) list.get(1); // but this fails with a ClassCastException
// because you cannot cast a String to Integer

使用原始类型(即省略其类型参数的泛型类型)是不安全的,这是您收到警告的原因。而不是仅仅使用,使用或或任何类型的你是什么。ArrayListArrayList<String>ArrayList<Integer>items


答案 2

数组列表中存储了哪些类型的对象?您需要将其添加到声明中。它总是

ArrayList<Type>

因此,如果它是JSONObjects的列表,您将把

ArrayList<JSONObject>

希望有所帮助。