Devuelve una instancia de clase con su tipo genérico
Aquí hay un ejemplo simple que demuestra un problema relacionado con el borrado de tipo con el que me encuentro. Tengo una clase como esta:
public abstract class AbstractHandler<T> {
...
public abstract Class<T> handledType();
}
Entonces tengo esta implementación:
public class ConcreteHandler extends AbstractHandler<Map<String, List<Thing>>> {
@Override
public Class<Map<String, List<Thing>>> handledType() {
//what do I return here?!
}
}
No puedo volverMap<String, List<Thing>>.class
, ya que eso ni siquiera es válido sintácticamente. Traté de hacer que el parámetro de tipo genérico en el subtipo seaHashMap<String, List<Thing>>
y luego volviendonew HashMap<String, List<Thing>>().getClass()
, pero eso no funciona porque el tipo de retorno deClass<T>#getClass()
esClass<? extends T>
. MiréTypeToken
de guayaba y elgetRawType
El método parecía prometedor, pero vuelveClass<? super T>
.
Por el momento, tengo una solución alternativa que se ve así:
public class ThingListMap {
private Map<String, List<Thing>> thingListMap;
...
}
y solo usoThingListMap
como el tipo de parámetro genérico.
Otra posible solución es realizar un lanzamiento forzado:
public Class<Map<String, List<Thing>>> handledType() {
return (Class<Map<String, List<Thing>>>) new HashMap<String, List<Thing>>().getClass();
}
¿Hay alguna forma más elegante de hacer esto?
EDITAR: En respuesta a una de las respuestas, no puedo cambiar la firma delhandledType
método ya que no soy dueño ni controlo su fuente.