您绝对应该阅读本关于 Java 泛型的教程:http :
//docs.oracle.com/javase/tutorial/java/generics/
简而言之:
许多 Java 类和类型(称为泛型类或泛型类型),通常是集合,具有所谓的类型参数,例如E
in ArrayList<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
s 都被“替换”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
使用原始类型(即省略了类型参数的泛型类型)是不安全的,这就是您收到警告的原因。而不是 just ArrayList
,使用ArrayList<String>
orArrayList<Integer>
或任何你的类型items
。