2013-01-08 13 views
19

Powiel możliwe:
ArrayList is a raw type. References to generic type ArrayList<E> should be parameterizedOstrzeżenie ArrayList jest typem nieprzetworzonym. Odniesienia do rodzajowego typu ArrayList <E> powinny być parametryzowane

w celu zaoszczędzenia ArrayList z płatności dokonywanych przez jednego członka Chcę zmienić listę identyfikatorów płatniczych w łańcuch, więc stworzyłem następującą metodę:

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

Ale dostaję fo Ostrzeżenie o wyrzucaniu:

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

Czy ktoś może mi wyjaśnić, dlaczego?

Odpowiedz

39

pewno powinien przeczytać ten poradnik na temat leków generycznych Java: http://docs.oracle.com/javase/tutorial/java/generics/

W skrócie:

wielu klas Java i typy (nazywane ogólne klasy lub typy ogólne), zazwyczaj kolekcje, mają tak zwaną Parametry e, takie jak E w ArrayList<E> (E to tylko arbitralne wybrana nazwa, inne klasy nazwać jako T lub cokolwiek):

public class ArrayList<E> extends ... { 

    public E get(int index) { ... } 

    public boolean add(E element) { ... } 

    // other methods... 
} 

Teraz, kiedy utworzyć instancję tej klasy, można zdefiniować beton wartość parametru typu, na przykład String (E można zazwyczaj ocenia się niezależnie od typu chcesz):

ArrayList<String> stringList = new ArrayList<String>(); 

od teraz, wszystkie E s są „zastąpiony” przez String do stringList Zmienna, dzięki czemu można dodać do niej tylko napisy i pobrać z niej tylko napisy. Kontrole kompilatora dla ciebie, że nie przez pomyłkę dodać obiekt innego typu:

stringList.add(Integer.valueOf(1)); 
// compile error - cannot add Integer to ArrayList of Strings 

Jednakże, ponieważ rodzajowych zostały dodane do Java 5, nadal jest możliwe napisanie kodu bez nich dla wstecznej kompatybilności . Możesz więc napisać:

ArrayList list = new ArrayList(); 

Ale tracisz wszystkie świadczenia sprawdzające typ. E s podpisy metody stają się po prostu 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 

Fakt, że przy użyciu surowy typ (czyli ogólny typ z jego parametrów typu pominąć) jest niebezpieczne, jest powodem ostrzeżenia co masz. Zamiast tylko ArrayList, użyj ArrayList<String> lub ArrayList<Integer> lub dowolnego innego typu Twojego items.

+0

Wow, dzięki temu! Bardzo jasne wyjaśnienie @Natix +1 – KarenAnne

+1

Can podajesz dokładne rozwiązanie zadanego pytania? – Satish

4

Jakie obiekty są przechowywane w ArrayList? Musisz dodać to do deklaracji. To zawsze

ArrayList<Type> 

Więc jeśli jest to lista JSONObjects, by umieścić

ArrayList<JSONObject> 

nadzieję, że pomoże.

1

Jest tak, ponieważ kompilator Java próbuje wykonać pewne sprawdzenie. W sposób, w jaki to napisałeś, efektywnie mówisz kompilatorowi, że otrzymasz ArrayList of Object jako parametr. Po prostu zachęcasz do określenia klasy obiektów, które będziesz przechowywać w ArrayList. Podanie wartości ArrayList<MyClass> lub ArrayList <?> spowoduje usunięcie ostrzeżenia. Druga wersja skutecznie informuje kompilator, że przekażesz ArrayList obiektów klasy nieznanej w czasie kompilacji.

Myślę, że może ci się przydać lektura na temat generyków w Javie. http://docs.oracle.com/javase/tutorial/java/generics/

1

JsonArray jest konstruktor spodziewa się otrzymać ogólny typ Collection parametrem T, a items jest typ jest ArrayList bez określonego typu (to znaczy typu surowy). Możesz sprawdzić to pytanie, aby uzyskać pewne wyobrażenie o rodzaju surowca: What is a raw type and why shouldn't we use it?

Rozwiązanie 1 (zalecana): pass items z paramter T lub określić konkretny rodzaj takich jak String. To pytanie może ci pomóc w konkretnym problemie: convert ArrayList<MyCustomClass> to JSONArray.

Rozwiązanie 2: dodaj @SuppressWarnings("unchecked") przed metodą fromArraytoString. Nie jest to zalecane, ale można odnieść się do tej kwestii: What is SuppressWarnings ("unchecked") in Java?

+0

Dzięki, mam listę identyfikatorów (powiedzmy 1, 2, 3 ...), które są wszystkie płatności w bazie danych. Chcę tylko przechowywać tę listę identyfikatorów w tablicy ArrayList w bazie danych. Czy możesz dać mi mały przykład? – Diego

+0

Po prostu zamiana 'fromArraytoString (ArrayList items)' inArraytoString (ArrayList pozycji) 'może działać (Jeśli twoje produkty są wszystkie typu" String " –

Powiązane problemy