2012-01-15 9 views

risposta

11

Il primo è valida solo dal Java 7, ed è la equivalente di

List<String> list = new ArrayList<String>(); 

È solo meno dettagliato.

stesso per il terzo, il che equivale a

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

e quindi strettamente equivalenti al secondo.

si dovrebbe preferire il primo, per i motivi di cui le risposte alla seguente domanda: List versus ArrayList as reference type?

2

Ci sono due punti da osservazione qui:

1. nuovo Java 7 operatore diamante che consente per istanziare una classe generica senza specificare il parametro type su entrambi i lati. Quindi, questi due sono equivalenti:

punto
ArrayList<String> list = new ArrayList<String>(); 
ArrayList<String> list = new ArrayList<>(); 

2. La più importante è la differenza tra le prime due istanze. La seconda è chiara:

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

Nel primo:

List<String> list = new ArrayList<>(); 

si sta utilizzando il fatto che ArrayList è un sottotipo di List e quindi l'assegnazione è valida. Tuttavia, sul nuovo oggetto list è disponibile solo il sottoinsieme di metodi inclusi in List (poiché l'oggetto è dichiarato come List dopo tutto), ma con le implementazioni presenti in ArrayList. Questo è chiamato polimorfismo nella programmazione orientata agli oggetti e consente di utilizzare un sottotipo di una classe anziché il genitore, in cui è previsto il genitore, al fine di fornire varie funzionalità diverse.

4

I tre sono in qualche modo equivalente:

List<String> list = new ArrayList<>(); 

In quanto sopra, si sta dichiarando una variabile che implementa l'interfaccia List che conterrà String elementi, e un'istanza con la classe concreta ArrayList. Inoltre, stai usando la nuova sintassi del diamante di Java 7, figlio che non devi scrivere di nuovo String tra <>.

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

In quanto sopra, il gioco è dichiarazione di una variabile della classe concreta ArrayList che conterrà String elementi, e un'istanza con la classe concreta ArrayList utilizzando la sintassi "tradizionale" che impone che si specifica il tipo String tra <>.

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

In quanto sopra, il gioco è dichiarazione di una variabile della classe concreta ArrayList che conterrà String elementi, e un'istanza con la classe concreta ArrayList. Inoltre, stai usando la nuova sintassi del diamante di Java 7, figlio che non devi scrivere di nuovo String tra <>.

Si noti che la sintassi del diamante (<>) funzionerà solo in Java 7 e versioni successive, per le versioni precedenti di Java si è bloccati utilizzando la sintassi tradizionale (<the-type>) per creare istanze generiche.

Le ultime due forme sono completamente equivalenti; il primo modulo è leggermente diverso dal momento che stai specificando che la variabile list è di tipo List e non di tipo ArrayList - e questa è la forma preferita, dal momento che le buone pratiche orientate agli oggetti richiedono che tu debba program to an 'interface', not an 'implementation'.

Problemi correlati