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

标签 java list generics

Possible Duplicate:
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

谁能解释一下为什么?

最佳答案

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

简而言之:

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

public 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 都被“替换”为 stringList,因此您只能向其中添加字符串并从中获取字符串。编译器会检查您是否错误地添加了其他类型的对象:

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

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

关于java - 警告 ArrayList 是原始类型。应参数化对泛型类型 ArrayList<E> 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14207005/

相关文章:

java - 使用通用 Java 实现接口(interface)

java - AES key 加解密与RSA key

python - 具有顺序限制的两个列表的元素的排列

python - 对元组列表中的值求和并按工作日排序

ios - 在 swift 中,一个函数可以是一个类型吗?

java - 堆是否被多个线程共享?

java - 是否可以在单个 Java 文件中从 Firebase 实时数据库调用两个不同的树?

java - 无法在数组列表中添加值?

generics - 实现拥有和借用的特征

java - Java 中的通用 fluent Builder