Возможный дубликат:
Почему не все данные типа удаляются в Java во время выполнения?
Генераторы Java реализуются с помощью стирания типа, поэтому я думал, что во время выполнения невозможно получить какую-либо информацию о параметризованном типе. Тем не менее, я нашел следующий класс в библиотеке Джексона.
(Я немного упростил класс ради этого примера)
public abstract class TypeReference<T> {
final Type _type;
protected TypeReference() {
Type superClass = getClass().getGenericSuperclass();
_type = ((ParameterizedType) superClass).getActualTypeArguments()[0];
}
public Type getType() { return _type; }
}
Класс предоставляет доступ к параметризованному типу, как показывает следующий тест:
void testTypeReference() {
// notice that we're instantiating an anonymous subclass of TypeReference
TypeReference<CurrencyDto> tr = new TypeReference<CurrencyDto>() {};
assert tr.getType() == CurrencyDto.class
}
Этот класс показывает, что фактические параметры типа могут быть получены во время выполнения (с использованием отражения), как это согласуется с понятием, что Java Generics реализованы с помощью стирания типа?