2009-12-03 10 views
21

infrazione di codiceJava Attenzione utilizzando vettori: chiamata incontrollato di aggiungere (E) po

Vector moves = new Vector(); 

moves.add(new Integer(x)); 

Errore:

ConnectFour.java:82: warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.Vector moves.add(new Integer(x)); 

Non proprio sicuro di quanto informazioni è necessario per un errore come questo .. ..

+6

Nota, non è un errore, è solo un avvertimento. È ancora perfettamente valido per fare quanto sopra, se non ti interessa l'avviso. – Joel

risposta

28

Il problema è che il codice sopra non utilizza generics.

Quanto segue funziona:

Vector<Integer> moves = new Vector<Integer>(); 

move.add(new Integer(x)); 

Il nome del tipo all'interno del <> (nel caso di Vector, il parametro di tipo E per l'elemento per tenere) dice al compilatore che tipo di oggetto si dovrebbe aspettare.

Se si cerca di aggiungere un oggetto che è del tipo specificato, come in questo caso, cercando di aggiungere un String ae Vector<Integer>, si verificherà un errore di compilazione, indicando che un tipo di oggetto che non è del tipo previsto è stato aggiunto.

Detto questo, si dovrebbe cercare di non utilizzare la classe Vector. Per altri scopi, una classe che implementa List come ArrayList da Java Collections Framework sarebbe sufficiente e con prestazioni migliori.

Modifica

Anche se non direttamente legato alla domanda su farmaci generici, Adam Paynter ha portato un buon punto nei commenti circa l'uso di auto-boxing.

Poiché Java 5, primitive e le relative classi wrapper, ad es. int e Integer verranno automaticamente convertiti tra di loro se necessario.

Pertanto, è possibile aggiungere un valore specificato come int o un int letterale in una classe in attesa di un Integer:

Vector<Integer> v = new Vector<Integer>(); 
v.add(5); // Not necessary to use an Integer value. 
+1

+1. Inoltre, sembra che stiano compilando per Java 5 o versioni successive. Per questo motivo, potrebbero anche trarre vantaggio dal box automatico: 'move.add (x);' –

4

Questo non è un errore, è solo un avviso del compilatore. Vector è di solito parametized, in modo di sbarazzarsi di avvertimento, basta usare farmaci generici:

Vector<Integer> moves = new Vector<Integer>(); 
moves.add(new Integer(x)); 
1
  1. inizializzare il vettore come questo

    Vector<Integer> moves = new Vector<Integer>(); 
    
  2. Usare preferibilmente java.util.ArrayList - si tratta di una sostituzione di Vector

3

Se non si ha altra scelta che utilizzare la struttura dati non generica , è possibile inserire @SuppressWarnings("unchecked") all'inizio del metodo per disattivare l'avviso.

Questo si può fare solo se non si ha altra scelta che usare il vettore non generico. Questo di solito accade quando lavori con vecchie librerie o determinate parti delle librerie di runtime Java.

0

non direttamente collegate al codice, ma è recommended da usare (a partire dalla versione> = 5):

Integer.valueOf(x); 

invece di

new Integer(x); 

Perché, alcuni valori interi {-128, ..., 127) sono nella cache e restituiranno sempre lo stesso oggetto. Questo è molto utile specialmente riguardo a autoboxing.

Problemi correlati