你一定要讀 Java的泛型本教程: http://docs.oracle.com/javase/tutorial/java/generics/
一言以蔽之:
許多Java類和類型(稱爲通用類別或通用類型),通常是集合,具有所謂的typ Ë參數,如ArrayList<E>
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的爲01「改爲」由變量,所以你可以只添加字符串,並只從它獲得字符串。編譯器會檢查你,你不要誤添加其他類型的對象:
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
。
Wow thanks to this!非常明確的解釋@Natix。+1 – KarenAnne
Can你提出問題的確切解決方案? – Satish