2012-03-30 8 views
15

Ich möchte zwei Listen entfernen: Zuerst ist eine Liste von Ganzzahlen. Ich entferne es als:Warum ist der Unterschied in der Deklaration generischer Listen?

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

Es funktioniert gut.

Zweitens ist eine Liste von Objekten. Ich erkläre es als:

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

Aber es gibt einen Fehler in der Sonnenfinsternis, sobald ich es schreibe. Der Fehler ist:

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 

Stattdessen, wenn ich

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

schreiben Es funktioniert gut.

Ich bin nicht in der Lage, den Grund herauszufinden.

Antwort

14

Betrachten Sie this post on stackoverflow.

15.12.2.7 Folgern Typ Argumente Basierend auf aktuellen Argumente

Ein Supertyp-Einschränkung T:> X bedeutet, dass die Lösung eines der geordneten Typen von X. mehrere solcher Zwänge auf T gegeben ist, können wir Schnittmenge die Sätze von Supertypen, die von jeder der Einschränkungen impliziert werden, da der Typ Parameter ein Mitglied von allen sein muss. Wir können dann wählen Sie die spezifischsten Typ, der in der Kreuzung

Die restriktive Art Kreuzung zwischen String, Double und Integer ist sowohl die Schnittstellen Comparable und Serializable ist. Also, wenn Sie

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

Es T folgert implements Comparable<?>, Serializable sein .Dann ist, als ob Sie

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

Offensichtlich ist dies nicht erlaubt.
Auf der anderen Seite, wenn Sie Object explizit mit

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

keine Folgerung

+0

Bekam es. Danke für die extrem gute Erklärung. Dies wird eine goldene Regel sein, um im Falle solcher Verwirrungen zu gelten. –

2

verwenden funktioniert perfekt

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

System.out.println(objs); 

Ausgabe angeben gemacht wird: [10, 20,32, Test]

+3

Das ist in Ordnung, aber beachten Sie, dass 'List ' ist * nicht * das gleiche wie 'List ', und das OP kann eine" Liste " – Bohemian

+1

-1 benötigen Wie das OP erklärte,' Arrays. asList (1,2,13, "drei") 'funktioniert gut.Die Frage war, warum der Compiler nicht auf "Object" schließen kann und nicht darauf, wie man eine Lösung hackt. –

Verwandte Themen