2013-01-08 12 views
19

Eventuali duplicati:
ArrayList is a raw type. References to generic type ArrayList<E> should be parameterizedAvviso ArrayList è un tipo non elaborato. I riferimenti al tipo generico ArrayList <E> dovrebbero essere parametrizzato

Al fine di salvare un ArrayList con pagamenti effettuati da un membro voglio cambiare l'Elenco di pagamento ID di in una stringa, quindi ho creato il seguente metodo:

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

Ma ho capito warning:

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

Qualcuno può spiegarmi perché?

risposta

39

Sicuramente si dovrebbe leggere questo tutorial su generici Java: http://docs.oracle.com/javase/tutorial/java/generics/

In poche parole:

Molte classi Java e tipi (chiamati classi generiche o tipi generici), in genere raccolte, si chiamano così typ e parametri, come E in ArrayList<E> (E è solo un nome scelto arbitrario, altre classi il nome come T o qualsiasi altra cosa):

public class ArrayList<E> extends ... { 

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

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

    // other methods... 
} 

Ora, quando si crea un'istanza di tale classe, si definisce una concreta valore del parametro tipo, ad esempio String (E di solito può essere valutata a qualsiasi tipo che si desidera):

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

da ora in poi, tutti i E s vengono "sostituiti" con String per il 01 Variabile, quindi è possibile aggiungere solo stringhe e ottenere solo stringhe da esso. I controlli del compilatore per te, che non si erroneamente aggiunto un oggetto di un altro tipo:

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

Tuttavia, poiché i generici sono state aggiunte a Java 5, è ancora possibile scrivere codice senza di loro per la compatibilità all'indietro . Così puoi scrivere:

ArrayList list = new ArrayList(); 

Ma si perdono tutti i vantaggi del controllo di tipo. E s nelle firme dei metodi diventano semplicemente 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 

Il fatto che l'utilizzo di un tipo di grezzo (che è un tipo generico con i suoi parametri di tipo omesso) è sicuro, è la ragione per l'avvertimento che hai. Invece di solo ArrayList, usa ArrayList<String> o ArrayList<Integer> o qualunque sia il tipo di tuo items.

+0

Wow grazie a questo! Spiegazione molto chiara @Natix. +1 – KarenAnne

+1

Can fornisci la soluzione esatta per la domanda? – Satish

4

Che tipo di oggetti sono memorizzati in ArrayList? Devi aggiungerlo alla dichiarazione. E 'sempre

ArrayList<Type> 

Quindi, se si tratta di un elenco di JSONObjects, si dovrebbe mettere

ArrayList<JSONObject> 

Speranza che aiuta.

1

Questo perché il compilatore Java tenta di eseguire determinati controlli. Il modo in cui l'hai scritto ti dice effettivamente al compilatore che riceverai ArrayList di Object come parametro. Ti sta semplicemente incoraggiando a specificare la classe di oggetti che dovrai archiviare in ArrayList. Specificando ArrayList<MyClass> o ArrayList <?> si eliminerebbe l'avviso. La seconda versione dice in modo efficace al compilatore che si passerebbe a ArrayList oggetti di classe sconosciuti in fase di compilazione.

Penso che potrebbe essere utile leggere un po 'di generici in Java. http://docs.oracle.com/javase/tutorial/java/generics/

1

JsonArray 's costruttore si aspetta di ricevere un tipo generico Collection con parametro T, mentre items' s tipo è ArrayList senza tipo specificato (cioè tipo grezzo). Check questa domanda per avere qualche idea sul tipo di grezzo: What is a raw type and why shouldn't we use it?

Soluzione 1 (consigliato): pass items con paramter T o specificare tipo concreto, come String. Questa domanda potrebbe aiutarti nel tuo problema specifico: convert ArrayList<MyCustomClass> to JSONArray.

Soluzione 2: aggiungere @SuppressWarnings("unchecked") prima del metodo fromArraytoString. questo non è consigliato, ma è possibile fare riferimento a questa domanda: What is SuppressWarnings ("unchecked") in Java?

+0

Grazie, ho una lista di ID (diciamo, 1, 2, 3 ...) che sono tutti pagamenti in un database. Voglio solo memorizzare questo elenco di ID in un ArrayList in un database. Puoi darmi un piccolo esempio? – Diego

+0

Basta cambiare 'fromArraytoString (elementi ArrayList)' in a 'fromArraytoString (ArrayList elementi)' potrebbe funzionare (Se i tuoi elementi sono tutti di tipo 'String'. –

Problemi correlati