Retornar uma instância de classe com seu tipo genérico
Aqui está um exemplo simples que demonstra um problema relacionado ao apagamento de tipo que estou enfrentando. Eu tenho uma classe como esta:
public abstract class AbstractHandler<T> {
...
public abstract Class<T> handledType();
}
Então eu tenho esta implementação:
public class ConcreteHandler extends AbstractHandler<Map<String, List<Thing>>> {
@Override
public Class<Map<String, List<Thing>>> handledType() {
//what do I return here?!
}
}
Não posso voltarMap<String, List<Thing>>.class
, já que isso nem é válido sintaticamente. Eu tentei fazer o parâmetro-tipo genérico no subtipo para serHashMap<String, List<Thing>>
e depois retornandonew HashMap<String, List<Thing>>().getClass()
, mas isso não funciona porque o tipo de retorno deClass<T>#getClass()
éClass<? extends T>
. Eu olheiTypeToken
da goiaba e dagetRawType
parecia promissor, mas retornaClass<? super T>
.
Por enquanto, tenho uma solução alternativa que se parece com isso:
public class ThingListMap {
private Map<String, List<Thing>> thingListMap;
...
}
e eu apenas usoThingListMap
como o parâmetro-tipo genérico.
Outra solução possível é executar uma conversão forçada:
public Class<Map<String, List<Thing>>> handledType() {
return (Class<Map<String, List<Thing>>>) new HashMap<String, List<Thing>>().getClass();
}
Existe uma maneira mais elegante de fazer isso?
EDITAR: Em resposta a uma das respostas, não posso alterar a assinatura dohandledType
método desde que eu não possuo ou controle sua fonte.