2013-01-08 79 views
19

可能重複:
ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized警告ArrayList是一種原始類型。引用泛型類型的ArrayList <E>應該是參數

爲了節省由一個成員完成支付一個ArrayList我想改變付款的ID的列表成一個字符串,所以我創建了以下方法:

public String fromArraytoString(ArrayList items){ 
     JSONObject json = new JSONObject(); 
     json.put("uniqueArrays", new JSONArray(items)); 
     return json.toString(); 
      } 

但是我得到了fo夜間警告:

ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized 

任何人都可以解釋我爲什麼嗎?

回答

39

你一定要讀 Java的泛型本教程: http://docs.oracle.com/javase/tutorial/java/generics/

一言以蔽之:

許多Java類和類型(稱爲通用類別通用類型),通常是集合,具有所謂的typ Ë參數,如ArrayList<E>EE只是一個任意選擇的名稱,其他類命名爲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>(); 

從現在開始,所有的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

+0

Wow thanks to this!非常明確的解釋@Natix。+1 – KarenAnne

+1

Can你提出問題的確切解決方案? – Satish

4

什麼樣的對象都存儲在ArrayList中?您需要將其添加到聲明中。它總是

ArrayList<Type> 

所以,如果它是一個JSONObjects的列表,你乾脆把

ArrayList<JSONObject> 

希望有所幫助。

1

這是因爲Java編譯器試圖爲你做一定的檢查。你寫它的方式有效地告訴編譯器你將接收Object的ArrayList作爲參數。 這只是鼓勵你指定你將要存儲在ArrayList中的對象類。指定ArrayList<MyClass>ArrayList <?>將擺脫警告。第二個版本有效地告訴編譯器,你將在編譯時傳遞類未知對象的ArrayList。

我想給你讀一些關於Java泛型它可能是有用的。 http://docs.oracle.com/javase/tutorial/java/generics/

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:該方法fromArraytoString之前添加@SuppressWarnings("unchecked")。 這是不推薦的,但你可以參考這個問題:What is SuppressWarnings ("unchecked") in Java?

+0

謝謝,我有一個ID的列表(比方說,1,2,3 ...),這些都是數據庫中的付款。我只想將這個ID列表存儲在數據庫的ArrayList中。你能給我一個小例子嗎? – Diego

+0

只需將'fromArraytoString(ArrayList items)'改爲'fromArraytoString(ArrayList items)'就可以了(如果你的項目都是'String'類型的話 –

相關問題