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.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage