Es tut uns leid, wenn der Titel verwirrend erscheint, aber einige Beispiele sind in Ordnung.
Nehmen wir an, ich habe eine Java-Klasse mit einem generischen Typparameter:
%Vor% Ich kann eine Variable schreiben, um ein Objekt zu speichern, wobei der generische Parameter auf zB String
gesetzt ist. Java erlaubt mir auch, diese Variable einer anderen Variablen zuzuweisen, aber mit dem generischen Parameter, der auf den Platzhalter <?>
type gesetzt ist:
Wenn Sie jedoch bei der Arbeit mit einer Klasse mit einem generischen Parameter den Typ dieses Parameters als generisch festlegen, können Sie ein Objekt dieser Klasse einem identisch typisierten / generierten Typ nicht zuordnen, wenn letzterer (innerer / geschachtelter) Parameter hat den Platzhalter-Typ <?>
:
Der spezifische Kompilierungsfehler ist:
%Vor%Intuitiv würde ich denken, dass die fragliche Aufgabe kein Problem sein sollte. Warum ist diese Aufgabe ein Problem?
Das Problem, mit dem Sie konfrontiert werden, ist Covariance .
%Vor%Wenn dies kein Kompilierfehler wäre, wäre die letzte Codezeile möglich.
Sie könnten den Fehler umgehen, indem Sie Folgendes tun:
%Vor% Sie können add
jedoch auch nicht verwenden, weil Sie nicht wirklich wissen, was ? extends GenericClass<?>
ist (Covariance noch einmal). In diesem Fall können Sie nur über die Liste aufzählen und GenericClass<?>
erwarten.
Technisch gesehen liegt das daran, dass List<GenericClass<String>>
kein Untertyp von List<GenericClass<?>>
ist. Um es zum Laufen zu bringen, könnten Sie etwas wie
was wie erwartet funktionieren sollte (obwohl es ziemlich hässlich ist ...).
Siehe zum Beispiel diese SO-Frage für weitere Details