Java Liste der spezifischen Klasse zur Liste von java.lang.Object hinzufügen funktioniert mit Java 8 Streams - warum?

8
%Vor%

Warum funktioniert es mit Streams und funktioniert nicht für die einfache Menge?

    
user817795 14.06.2017, 14:06
quelle

3 Antworten

8

Für den ersten Fall schlägt es fehl, weil List<TestClass> kein Untertyp von List<Object> ist. 1

Für den zweiten Fall haben wir die folgenden Methodendeklarationen:

%Vor%

und:

%Vor%

Dadurch kann Java die generischen Typparameter aus dem Kontext ableiten. 2 In diesem Fall wird List<Object> für R und Object für T abgeleitet.

Damit entspricht Ihr Code dem:

%Vor%

1. Siehe z.B. hier .

2. Siehe z.B. hier oder hier .

    
Oliver Charlesworth 14.06.2017, 14:12
quelle
2

Diese Zeile

%Vor%

funktioniert nicht, weil List in Java invariant ist, dh List<TestClass> erweitert nicht List<Object> , wenn TestClass erweitert Object . Weitere Details hier

Diese Zeile

%Vor%

funktioniert, weil Java den generischen Typ von Object für Collector aus dieser Methodensignatur setListA(final List<Object> list) ableitet und Sie daher List<Object> dort übergeben

    
ikryvorotenko 14.06.2017 14:18
quelle
1

Die Typparameter von Java Generic sind invariance , was bedeutet, dass sie nicht als Typparameter-Klassenhierarchie vererbt werden können. Das gemeinsame übergeordnete Element von List<TestClass> und List<Object> ist List<?> .

Sie können detaillierte Antwort über Java-generische Platzhalter von kotlin & amp; Java . zum Beispiel:

%Vor%

Der Stream-Ansatz ist transform a List<TestClass> in List<Object> . Wenn Sie wollen, funktioniert es, ohne eine List in eine andere List nach Stream umzuwandeln. Ihre Methodensignatur sollte wie folgt aussehen und die Sammlung # addAll macht es auch in Java:

%Vor%     
holi-java 15.06.2017 09:31
quelle