警告ArrayList是原始类型。对泛型类型ArrayList <e>的引用应该参数化</e>

时间:2013-01-08 01:38:37

标签: java list generics

  

可能重复:
  ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized

为了保存一个由一个成员完成支付的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 个答案:

答案 0 :(得分:47)

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

简而言之:

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

E

现在,当您创建此类的实例时,您可以定义type参数的具体值,例如Tpublic class ArrayList<E> extends ... { public E get(int index) { ... } public boolean add(E element) { ... } // other methods... } 通常可以评估为您想要的任何类型):

String

从现在开始,E变量的所有ArrayList<String> stringList = new ArrayList<String>(); E“替换”,因此您只能为其添加字符串并仅从中获取字符串。编译器会检查您是否错误地添加了另一种类型的对象:

String

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

stringList

但是你失去了所有类型检查的好处。方法签名中的stringList.add(Integer.valueOf(1)); // compile error - cannot add Integer to ArrayList of Strings 变为ArrayList list = new ArrayList(); s。

E

使用原始类型(这是一个省略了类型参数的泛型类型)的事实是不安全的,这是你得到警告的原因。而不仅仅是Object,请使用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>的任何类型。

答案 1 :(得分:4)

ArrayList中存储了哪些对象?您需要将其添加到声明中。它总是

ArrayList<Type>

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

ArrayList<JSONObject>

希望有所帮助。

答案 2 :(得分:1)

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

我认为您可以阅读一些关于Java中泛型的内容。 http://docs.oracle.com/javase/tutorial/java/generics/

答案 3 :(得分:1)

JsonArray的构造函数希望收到参数为Collection的泛型T,而items的类型为ArrayList没有指定类型(即原始类型)。您可以查看此问题以了解原始类型:What is a raw type and why shouldn't we use it?

解决方案1(推荐):使用参数items传递T或指定具体类型,例如String。这个问题可能会帮助您解决具体问题:convert ArrayList<MyCustomClass> to JSONArray

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