2012-04-03 35 views
10

Ho due domande, actaully ... Prima di tutto, perché non posso faccio questo:Lista <Object> e Lista <?>

List<Object> object = new List<Object>(); 

E in secondo luogo, ho un metodo che restituisce un List<?>, come farei girare che in un List<Object>, sarei in grado di lanciarlo semplicemente?

Grazie!

+0

OK, se voi ragazzi dite che "Elenco " non può essere istanziato, allora com'è che il metodo può restituirlo? – Chris

+0

Vale la pena notare che 'Arrays.asList (T ... a)' restituisce un 'Elenco '. È possibile inizializzare 'List' con' List li = Arrays.asList (1, 2, "3"); 'per salvare un po 'di digitazione, anche se l'elenco restituito sarà di dimensioni fisse e supportato dall'array: https: //docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#asList(T ... –

risposta

28

Perchè non faccio questo:

List<Object> object = new List<Object>(); 

Non si può fare questo perché List è un'interfaccia, e le interfacce non possono essere istanziati. Solo le classi (concrete) possono essere. Esempi di classi concrete di attuazione List includono ArrayList, LinkedList ecc

Ecco come si potrebbe creare un'istanza di ArrayList:

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

Ho un metodo che restituisce un List<?>, come faccio a trasformare questa in un List<Object>

Mostraci il codice pertinente e aggiornerò la risposta.

+0

Il metodo che restituisce un 'Elenco ' proviene da una libreria esterna e non riesco ad arrivare a il codice. So solo che è stato usato per restituire un 'List ', e quindi hanno aggiornato il codice e ora restituisce un 'Elenco ', in pratica infrange tutti i miei codici. – Chris

+0

La risposta non risolve adeguatamente la seconda parte di la domanda, che ne dici di un esempio? –

4
List<Object> object = new List<Object>(); 

Non si può fare questo perché Lista è un'interfaccia e non è possibile creare l'oggetto di qualsiasi interfaccia o in altre parole, non è possibile creare un'istanza qualsiasi interfaccia. Inoltre, è possibile assegnare qualsiasi oggetto di classe che implementa Elenco alla sua variabile di riferimento. Per esempio si può fare questo:

list<Object> object = new ArrayList<Object>(); 

Qui ArrayList è una classe che implementa Lista, è possibile utilizzare qualsiasi classe che implementa Lista.

2

Elenco è un'interfaccia quindi non è possibile installarlo. Utilizza invece uno qualsiasi dei suoi implementatori, ad es.

List<Object> object = new List<Object>(); 

A proposito di listino: si può usare qualsiasi oggetto come un parametro generico per esso esempio:

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

o

List<?> list = new ArrayList<Integer>(); 

Durante l'utilizzo di List<Object> questa dichiarazione non è valido perché sarà digitare missmatch.

0

Per rispondere alla tua seconda domanda, sì, si può lanciare la List<?> come List<Object> o un List<T> di qualsiasi tipo, in quanto il parametro ? (jolly) indica che l'elenco contiene una raccolta omogenea di un qualsiasiObject. Tuttavia, non c'è modo di sapere al momento della compilazione cosa è il type poiché è solo parte dell'API esportata, il che significa che non è possibile vedere cosa viene inserito nello List<?>.

Ecco come si dovrebbe fare il cast:

List<?> wildcardList = methodThatReturnsWildcardList(); 
// generates Unchecked cast compiler warning 
List<Object> objectReference = (List<Object>)wildcardList; 

In questo caso è possibile ignorare l'avviso perché in modo che un oggetto da utilizzare in una classe generica deve essere un sottotipo di Object. Supponiamo che stiamo provando a trasmettere questo come List<Integer> quando in realtà contiene una raccolta di String s.

// this code will compile safely 
List<?> wildcardList = methodThatReturnsWildcardList(); 
List<Integer> integerReference = (List<Integer>)wildcardList; 

// this line will throw an invalid cast exception for any type other than Integer 
Integer myInteger = integerRefence.get(0); 

Ricordare: i tipi generici vengono cancellati in fase di esecuzione. Non si sa cosa contiene la raccolta, ma è possibile ottenere un elemento e chiamare .getClass() su di esso per determinare il suo tipo.

Class objectClass = wildcardList.get(0).getClass(); 
Problemi correlati