Warum funktioniert es mit Streams und funktioniert nicht für die einfache Menge?
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 .
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
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:
Tags und Links java java-8 inheritance generics java-stream