Вернуть экземпляр класса с его универсальным типом
Вот простой пример, который демонстрирует проблему, связанную со стиранием типов, с которой я сталкиваюсь. У меня есть такой класс:
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
метод, поскольку я не владею или не контролирую его источник.