Eine Klasseninstanz mit dem generischen Typ @ zurückgeb
Hier ist ein einfaches Beispiel, das ein Problem im Zusammenhang mit der Typlöschung zeigt, auf das ich stoße. Ich habe eine Klasse wie diese:
public abstract class AbstractHandler<T> {
...
public abstract Class<T> handledType();
}
Dann habe ich diese Implementierung:
public class ConcreteHandler extends AbstractHandler<Map<String, List<Thing>>> {
@Override
public Class<Map<String, List<Thing>>> handledType() {
//what do I return here?!
}
}
Ich kann nicht zurückkehrenMap<String, List<Thing>>.class
, da das syntaktisch gar nicht gültig ist. Ich habe versucht, den generischen Typparameter im Subtyp auf @ zu setzeHashMap<String, List<Thing>>
und dann zurücknew HashMap<String, List<Thing>>().getClass()
, aber das funktioniert nicht, weil der Rückgabetyp vonClass<T>#getClass()
istClass<? extends T>
. Ich sahTypeToken
aus Guave und dasgetRawType
Methode schien vielversprechend, aber es gibtClass<? super T>
.
Ich habe vorerst eine Problemumgehung, die so aussieht:
public class ThingListMap {
private Map<String, List<Thing>> thingListMap;
...
}
und ich benutze nurThingListMap
als generischer Typparameter.
Eine weitere mögliche Problemumgehung besteht darin, eine erzwungene Besetzung durchzuführen:
public Class<Map<String, List<Thing>>> handledType() {
return (Class<Map<String, List<Thing>>>) new HashMap<String, List<Thing>>().getClass();
}
Gibt es eine elegantere Möglichkeit, dies zu tun?
BEARBEITEN Als Antwort auf eine der Antworten kann ich die Signatur des @ nicht änderhandledType
Methode, da ich ihre Quelle nicht besitze oder kontrolliere.