Получать значение универсальной декларации программным путем?

Объявляю класс следующим образом:

public class SomeClass extends AdditionalClass<GenericClass> {
  ...
}

Это...

SomeClass object = new SomeClass();
System.out.println(object.getSuperClass().getSimpleName());

... дает значение "AdditionalClass". Какой вызов или вызовы методов позволили бы мне допросить этот объект и получить "GenericClass" в результате?

Ответ 1

Вы должны получить массив ParameterizedType (s) суперкласса. Например:

SomeClass object = new SomeClass();
Type parameterizedClassType = 
         ((ParameterizedType) object.getClass().getGenericSuperclass())
         .getActualTypeArguments()[0];
System.out.println(parameterizedClassType.getTypeName());

Это должно печатать com.whateverpackage.GenericClass.

Обратите внимание, что даже стирание типа происходит, когда SomeClass скомпилирован, информация о параметрах типа о суперклассе (es) сохраняется, поскольку они являются частью определения класса.

Однако, если SomeClass был общим (т.е. был чем-то вроде SomeClass<X> extends AdditionalClass<GenericClass>), то для всех экземпляров SomeClass параметр типа (т.е. <X>) был бы заменен некоторым фактическим типом, который не будет включен в массив .getActualTypeParameters().