Ich habe diesen Code nicht zur Kompilierung bekommen:
%Vor% Es scheint, dass Java List
und List<?>
nicht als den gleichen Typ betrachtet, wenn es um Generika geht.
Warum ist das? Und gibt es einen schönen Ausweg?
Es gibt eine Bibliotheksfunktion mit folgender Signatur: public <T> Set<Class<? extends T>> getSubTypesOf(final Class<T> type)
. Dies funktioniert gut für einfache Typen, die als Argument übergeben werden, aber im Fall von Generics wird das Ergebnis nicht mit einem Platzhalter parametrisiert, was dazu führt, dass javac sich über den rohen Typ beschweren muss. Ich möchte das Ergebnis als Set<Class<? extends GenericTypeHere<?>>>
an den Rest meiner Anwendung weitergeben, aber die einfache Umwandlung funktioniert nicht wie erwartet.
Danke für die Antworten, hier ist, wie ich es am Ende funktioniert:
%Vor%Okay, das liegt an einem subtilen semantischen Unterschied.
%Vor% Dies ist der rohe Typ von List
, was bedeutet, dass T
vom Typ Object
ist. Es ist also dasselbe wie zu sagen:
Nun weiß der Compiler, dass dies eine Unterklasse vom Typ Object
ist. Und wenn Sie das tun ..
Es wird gut funktionieren! Dies liegt daran, dass Object
gleich ist oder eine Ableitung des Typs ist.
Dies ist wörtlich eine Liste unbekannter ( Java-Dokumente ). Wir wissen nicht einmal, dass die Unterklasse der Dinge hier vom Typ Object
ist. Tatsächlich ist der ?
Typ ein unbekannter Typ für sich allein. Es hat nichts mit Object
zu tun! Deshalb, wenn Sie versuchen und tun ..
Sie erhalten einen Kompilierzeitfehler!
Tags und Links java generics casting raw-types unbounded-wildcard