Вернуть экземпляр класса с его универсальным типом

Вот простой пример, который демонстрирует проблему, связанную со стиранием типов, с которой я сталкиваюсь. У меня есть такой класс:

public abstract class AbstractHandler<T> {

    ...
    public abstract Class<T> handledType();
}

Тогда у меня есть эта реализация:

public class ConcreteHandler extends AbstractHandler<Map<String, List<Thing>>> {

    @Override
    public Class<Map<String, List<Thing>>> handledType() {
        //what do I return here?!
    }
}

Я не могу вернутьсяMap<String, List<Thing>>.class, поскольку это даже не верно синтаксически. Я попытался сделать общий параметр типа в подтипе, чтобыHashMap<String, List<Thing>> а затем возвращаясьnew HashMap<String, List<Thing>>().getClass(), но это не работает, потому что тип возвращаемого значенияClass<T>#getClass() являетсяClass<? extends T>, я смотрел наTypeToken из Гуавы, иgetRawType метод казался многообещающим, но он возвращаетсяClass<? super T>.

У меня есть временное решение, которое выглядит так:

public class ThingListMap {
    private Map<String, List<Thing>> thingListMap;

    ...
}

и я просто используюThingListMap как универсальный тип-параметр.

Другой возможный обходной путь - выполнить принудительное приведение:

public Class<Map<String, List<Thing>>> handledType() {
    return (Class<Map<String, List<Thing>>>) new HashMap<String, List<Thing>>().getClass();
}

Есть ли более элегантный способ сделать это?

РЕДАКТИРОВАТЬ: В ответ на один из ответов я не могу изменить подписьhandledType метод, поскольку я не владею или не контролирую его источник.

Ответы на вопрос(0)

Ваш ответ на вопрос