29

可能重复:
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

谁能解释我为什么?

4

4 回答 4

64

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

简而言之:

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

public class ArrayList<E> extends ... {

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

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

    // other methods...
}

现在,当您创建此类的实例时,您定义了类型参数的具体值,例如StringE通常可以评估为您想要的任何类型):

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

从现在开始,所有的Es 都被“替换”StringstringList变量,所以你可以只向它添加字符串,并且只能从中获取字符串。编译器会检查您是否错误地添加了另一种类型的对象:

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

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

ArrayList list = new ArrayList();

但是你失去了所有类型检查的好处。E方法签名中的 s 变成了简单Object的 s。

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

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

于 2013-01-08T01:49:21.220 回答
4

ArrayList 中存储了哪些类型的对象?您需要将其添加到声明中。总是如此

ArrayList<Type>

所以如果它是 JSONObjects 的列表,你会放

ArrayList<JSONObject>

希望有帮助。

于 2013-01-08T01:44:32.403 回答
1

这是因为 Java 编译器会尝试为您进行某些检查。您编写它的方式有效地告诉编译器您将收到对象的 ArrayList 作为参数。它只是鼓励您指定要存储在 ArrayList 中的对象类别。指定ArrayList<MyClass>orArrayList <?>将摆脱警告。第二个版本有效地告诉编译器您将传递在编译时未知的类对象的 ArrayList。

我认为阅读一些有关 Java 泛型的知识可能对您有用。 http://docs.oracle.com/javase/tutorial/java/generics/

于 2013-01-08T01:46:04.523 回答
1

JsonArray的构造函数期望接收Collection带有参数的泛型类型T,而items' 的类型ArrayList没有指定类型(即原始类型)。您可以查看这个问题以了解原始类型:什么是原始类型,我们为什么不应该使用它?

items解决方案 1(推荐):带参数传递T或指定具体类型,例如String. 这个问题可能会对您的具体问题有所帮助:将 ArrayList<MyCustomClass> 转换为 JSONArray

解决方案2:@SuppressWarnings("unchecked")在方法之前添加fromArraytoString。不推荐这样做,但是可以参考这个问题:What is SuppressWarnings ("unchecked") in Java?

于 2013-01-08T01:46:47.613 回答