Listenliste? und ListList sind inkompatible Typen in Java [duplizieren]

9

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?

Kontext

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.

BEARBEITEN: Lösung

Danke für die Antworten, hier ist, wie ich es am Ende funktioniert:

%Vor%     
Oliver Gondža 14.03.2015, 23:31
quelle

2 Antworten

1

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:

%Vor%

Nun weiß der Compiler, dass dies eine Unterklasse vom Typ Object ist. Und wenn Sie das tun ..

%Vor%

Es wird gut funktionieren! Dies liegt daran, dass Object gleich ist oder eine Ableitung des Typs ist.

%Vor%

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 ..

%Vor%

Sie erhalten einen Kompilierzeitfehler!

    
christopher 14.03.2015, 23:43
quelle
-2
%Vor%

funktioniert

Set<Class<? extends GenericTypeHere<?>>>

würde bedeuten %Code% wie in der obigen Platzhalterantwort

erwähnt

Was hält Sie davon ab,

zu verwenden?

Set<Class<YourClass extends AnotherClass<YourClass>>> , um sich in Ihrer gesamten App zu verbreiten?

    
puj 14.03.2015 23:35
quelle