2012-02-16 12 views
7

Come C++ Oldtimer sono riuscito a risolvere il mio problema, ma non posso avvolgere la mia testa intorno ai meccanismi di Java sottostanti qui:Lista Java vs ArrayList

Vector<Object> x = new Vector<Object>();  // OK 
ArrayList<Object> y = new ArrayList<Object>(); // OK 
List<Object> zzz = new ArrayList<Object>();  // OK solves problem below but question remains 
List<Object> z = new List<Object>();   // WHY? Compiler error: Cannot instantiate 

risposta

14

List è un'interfaccia, un po 'come una classe con una certa = 0 metodi in C++. Non puoi istanziarlo.

Ma ArrayList<T> "eredita" List<T> (o in termini Java, lo implementa), quindi tali riferimenti sono compatibili con l'assegnazione.

+0

Grazie a tutti voi. – Adam

+0

Voi ragazzi siete veramente veloci – Adam

+0

@Adam - aspettate di arrivare ai caratteri jolly nei generici di Java! :) Le risposte richiedono un po 'più tempo per apparire. –

5

Elenco è un'interfaccia, non è possibile inizializzarlo. ArrayList implementa List, quindi è possibile assegnare un'istanza ArrayList a una variabile List.

1

L'elenco non è classe è un'interfaccia e non è possibile creare un'istanza dell'oggetto di interfaccia.

ArrayList è la classe che era implementare l'interfaccia List così può in grado di un'istanza dell'oggetto ArrayList e assegnare all'oggetto List

1

Il List è un'interfaccia. Non è possibile creare in caso di un'interfaccia utilizzando l'operatore new. Ecco perché la riga List<Object> z = new List<Object>(); dà errore. Solo le classi possono essere istanziate.

0

List è un interface e un'interfaccia non può essere istanziata.

È utilizzato per implementare il polimorfismo. cioè un riferimento di tipo di interfaccia può contenere oggetto di qualsiasi classe che è implements esso.

List<Object> zzz = new ArrayList<Object>(); 

funziona, causa ArrayList implementa Elenco.

1

"Interfaccia" è come un protocollo che un oggetto deve rispettare.

+0

Interessante approccio per utilizzare i protocolli come un'analogia. Anche se un pochino di testo in più, cos'è "it" e cosa no potrebbe rendere le cose un po 'più chiare. –

+1

Non ho mai sentito il protocollo in questo contesto. Ma capisco cosa intendi. Preferisco il termine contratto: http://en.wikipedia.org/wiki/Design_by_contract – Adam

+0

@Adam Sono d'accordo, il contratto è una parola migliore. – Benjamin

2

Sì. Poiché List è un'interfaccia e in Java non è possibile creare un'istanza di un'interfaccia. È possibile creare un'istanza di una classe.

ArrayList è una classe che sta implementando l'Elenco <> ecco perché è possibile creare un'istanza. :)