2016-08-15 9 views
2

Ich sollte das wissen, aber ich kann das aus irgendeinem Grund nicht verstehen.Besetzung Liste <Object> zu Liste <Map <String, Objekt >>

Warum kann ich eine Liste von Objekten List<Object> nicht in eine Liste von Karten List<Map<String, Object>> umwandeln? Jedes Objekt in der Liste ist ein Objekt vom Typ Map<String, Object>. Warum ist das Gießen nicht möglich?

Was ich tun kann, ist ein new ArrayList<Map<String, Object>>(); erstellen und durchlaufen über die Liste und fügen Sie jedes Element mit einer Besetzung.

List<Object> dataList; 
.. 
//Why doesn't this work? 
List<Map<String, Object>> rxData = (List<Map<String, Object>>)dataList; 

//This works, but is there a better way? 
rxData = new ArrayList<Map<String, Object>>(); 
for (Object data : dataList) { 
    rxData.add((Map<String, Object>)data); 
} 
+0

Warum? Weil Generika von Java nicht replizierbar sind. Es gibt keine Möglichkeit für die JVM, die Besetzung zu überprüfen. Wenn du es einfach trotzdem machen willst, denke ich '@SuppressWarnings (" unchecked ") ist die Lösung, obwohl ich das nicht getestet habe. – markspace

+1

Java Generics FAQ: http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#What%20is%20the%20SuppressWarnings%20annotation? – markspace

Antwort

3

Sie können nur allgemeine Parameter durch Doppelgießen fallen:

@SuppressWarnings("‌​unchecked") 
List<Map<String, Object>> rxData = 
    (List<Map<String, Object>>) (List<?>) dataList; 

Was geht hier ist, dass Sie Compiler zu zwingen, nicht gattungsgemäßen Art zu überprüfen, indem sie sie mit Erstbesetzung Weglassen und dann unkontrolliert tun auf List<Map<String, Object>> werfen. Dies ist möglich, weil Java Generics nicht refiable ist.

Der ursprüngliche Fehler wird durch dadurch verursacht, dass Object mit Map<> Typ nicht kompatibel ist, und es gibt nicht so etwas wie covariant/kontra Typen in Java (im Gegensatz zu scala zum Beispiel).

Aber es wird ein Problem geben, wenn dataList enthält keine Karten.

+2

Hier ist kein Rohtyp erforderlich, und das Problem hängt nicht mit der Ersteigbarkeit zusammen. –

+0

@ k5_ zustimmen. Vielen Dank! aber das wird sowieso nicht kontrolliert. Ich bearbeite meine Antwort – vsminkov

+0

Danke! OK, ich denke, ich verstehe, und ich muss vorsichtig sein, damit die Liste außer Karten nichts enthält. – Andy

4

List<Object> und List<Map<String, Object>>are not compatible types, daher können Sie nicht direkt auf den anderen übertragen. Sie würden zu einem gemeinsamen Supertyp zu ersten Wurf haben und dann niedergeschlagenen:

List<Map<String, Object>> rxData = (List<Map<String, Object>>)(List<?>)dataList; 

Beachten Sie, dass Sie immer noch eine Warnung bei der Kompilierung bekommen, weil es ein unsafe cast ist.

0

prüfen folgenden Link

https://docs.oracle.com/javase/tutorial/java/generics/inheritance.html

zwei generische Klassen Typ1 und Typ2 sind nicht verwandt. Sie können also nicht einen zum anderen tippen.

Sie können jedoch einige unsichere Operationen ausführen und sich aus der Schleife retten.

//unsafe assignments 
List rxData = (List<Map<String, Object>>)dataList; 

List<Object> dataList = (List<Object>)rxData; 
Verwandte Themen