2013-03-01 17 views
8

Attualmente sto studiando per l'esame Java OCA e ho trovato una domanda relativa alle dichiarazioni di ArrayList.Dichiarazioni di ArrayList Java

Quale dei seguenti è valida ?:

1. ArrayList al1 = new ArrayList(); 
2. ArrayList al2 = new ArrayList<>(); 
3. ArrayList<> al3 = new ArrayList<>(); 
4. ArrayList<Double> al4 = new ArrayList<>(); 
5. ArrayList<Double> al5 = new ArrayList<Float>(); 

Secondo il mio libro, risponde 1,2 e 4 sono validi. Le risposte 3 e 5 non sono valide.

Tuttavia, non viene fornita alcuna spiegazione adeguata. Tutto ciò che fa è mostrare il modo standard di dichiarare un ArrayList:

ArrayList<E> al3 = new ArrayList<E>(); 

e menzioni che è valida anche per dichiarare l'ArrayList senza la parte generica.

Non riesco a trovare un articolo decente su questo argomento online. Qualcuno può spiegare (o indicarmi nella direzione di un buon articolo) le differenti permutazioni sopra?

Grazie in anticipo.

+2

Alcuni farmaci generici venivano mangiati dalla formattazione SO. – Vlad

+0

Grazie mi ha molto confuso: P – cowls

+0

per quanto riguarda 3. il '<>' è chiamato 'operatore diamante' ed è stato introdotto con 'java7'. è una scorciatoia per instaziare oggetti generici, quindi non è necessario specificare il tipo una seconda volta quando si utilizza 'new' poiché è già specificato nella dichiarazione della variabile. – A4L

risposta

14

1 è valido per tutte le versioni di Java

Qui si dichiara l'ArrayList senza usare Generics. Ciò significa indipendentemente da ciò che si aggiunge all'arrayist, quando si torna indietro sarà di tipo Object e richiederà il cast di un tipo. Questo è il vecchio modo di utilizzare Collections in Java 1.4 (pre generics) ed è supportato per la compatibilità all'indietro. Al giorno d'oggi dovresti sempre usare Generics.


2 e 4 sono validi in Java 7 solo

Le parentesi vuote: <> sono nuovo tipo di inferenza Java7 che significa che non è necessario specificare il tipo di due volte. Nota Java7, non funzionerà con le versioni precedenti.

Quindi, in Java7

ArrayList<Double> al4 = new ArrayList<>(); 

è lo stesso di

ArrayList<Double> al4 = new ArrayList<Double>(); 

Questo legame ha più informazioni di inferenza: http://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html


3 non è valido perché se si utilizza Generics è necessario specificare un tipo nella dichiarazione della variabile.


5 è invalido perché se si dichiara una lista con tipo Double non si può quindi assegnare un elenco che è di tipo float, si può solo assegnare un elenco di tipo Double.

Quindi questo sarebbe valido:

ArrayList<Double> al5 = new ArrayList<Double>(); 
+0

Grazie per la tua risposta veloce e chiara. Ora sono sicuro di poter gestire una domanda simile se si presenta all'esame. – user2123069

+0

Nessun problema, buona fortuna con l'esame – cowls

2

Sotto 2 sarà valida only in Java SE7. Java SE7 consente l'inferenza del tipo, quindi non è necessario fornire nuovamente il tipo all'interno di <>.

ArrayList<Double> al4 = new ArrayList<>(); 
    ArrayList al2 = new ArrayList<>(); 

D'altra parte sottostante uno è valido all Java versions; questo è per garantire la retrocompatibilità del codice non generico.

ArrayList al1 = new ArrayList(); 

Qui di seguito non è consentito la raccolta di Float non è un sottotipo di raccolta di Double. Inoltre Float non è sottotipo di Double; quindi non importa che sia una dichiarazione valida. Si noti che anche la versione dell'array non viene compilata.

Double[] dd = new Float[5]; //won't compile 
ArrayList<Double> al5 = new ArrayList<Float>(); //won't compile 

Qui di seguito uno non è una dichiarazione valida.

ArrayList<> al3 = new ArrayList<>();