Warum kann ein generischer Typ, der einen generischen Typ enthält, nicht einer generisch typisierten Klasse eines Wildcard-Typs zugewiesen werden

8

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:

%Vor%

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 <?> :

%Vor%

Der spezifische Kompilierungsfehler ist:

%Vor%

Intuitiv würde ich denken, dass die fragliche Aufgabe kein Problem sein sollte. Warum ist diese Aufgabe ein Problem?

    
Adam Batkin 25.09.2009, 09:58
quelle

2 Antworten

8

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.

    
bruno conde 25.09.2009, 10:39
quelle
4

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

tun %Vor%

was wie erwartet funktionieren sollte (obwohl es ziemlich hässlich ist ...).

Siehe zum Beispiel diese SO-Frage für weitere Details

    
Dirk 25.09.2009 10:25
quelle

Tags und Links