2012-03-30 2 views
15

Voglio decaricare due elenchi: Il primo è un elenco di numeri interi. L'ho decodificato come:Perché la differenza nella dichiarazione degli elenchi generici?

List<Integer> ints= Arrays.asList(1,2,3); 

Funziona bene.

Secondo è un elenco di oggetti. Lo dichiavo come:

List<Object> objs= Arrays.asList(1,2.13,"three"); 

Ma dà un errore in eclissi non appena scrivo. L'errore è:

Multiple markers at this line 
- Type mismatch: cannot convert from List<Object&Comparable<?>&Serializable> to 
List<Object> 
- Type safety: A generic array of Object&Comparable<?>&Serializable is created for 
     a varargs parameter 

Invece se scrivo

List<Object> objs = Arrays.<Object>asList(1,2.13,"three"); 

Funziona benissimo.

Non riesco a capire il motivo.

risposta

14

Vedere this post on stackoverflow.

15.12.2.7 inferire tipo argomenti relativi argomenti effettivi

Un supertipo vincolo T:> X implica che la soluzione è quella di supertipi di X. dato diverse tali vincoli su T, si può intersecare i set di supertipi impliciti da ciascuno dei vincoli, poiché il parametro di tipo deve essere un membro di tutti loro. Possiamo quindi scegliere il tipo più specifico che è l'intersezione

Il tipo intersezione più restrittivo tra String, Double e Integer sia le interfacce Comparable e Serializable. Così, quando si scrive

Arrays.asList(1,2.13,"three"); 

Si deduce T essere implements Comparable<?>, Serializable .Poi è come se si sta facendo

List<Object> objs = new List<T extends Comparable<?>, Serializable> 

Ovviamente, questo non è permesso.
D'altra parte, quando si specifica Object esplicitamente usando

Arrays.<Object>asList(1,2.13,"three"); 

nessuna deduzione è fatta

+0

Capito. Grazie per l'ottima spiegazione. Questa sarà una regola d'oro da applicare in caso di tali confusioni. –

2

Utilizzare questo funziona perfettamente

List<? extends Object> objs = Arrays.asList(10,20.32,"test"); 

System.out.println(objs); 

uscita: [10, 20,32, prova]

+3

Va bene, ma si noti che per quanto riguarda il compilatore, 'Elenco ' è * non * uguale a 'Elenco ', e l'OP potrebbe aver bisogno di un' Elenco' – Bohemian

+1

-1 Come indicato dall'OP,' Array. asList (1,2,13, "tre") 'funziona correttamente.La domanda era: perché il compilatore non riesce a dedurre 'Object', non come hackerare una soluzione. –