Следующий код:
public static void main(String args[]) throws NoSuchFieldException {
List<Integer> li = new ArrayList<Integer>();
ParameterizedType apType = (ParameterizedType) li.getClass().getGenericSuperclass();
Type[] typeArguments = apType.getActualTypeArguments();
int _i = 0;
for (Type type : typeArguments) {
System.out.format("parameterized type %d is: %s", ++_i, type);
}
}
производит:
parameterized type 1 is: E
- Правильно ли я понимаю, что это связано с эффектами Type Erasure и что его следует интерпретировать как «неизвестно», учитывая, что E — это имя параметра типа?
- Мне кажется странным, что я каким-то образом должен интерпретировать имя «Е» (и я полагаю, что «S», «U» и т. д., если они существуют) специально. А если у меня класс "Е"? Кроме того, имя метода — get_Actual_TypeArguments. Учитывая, что параметры типа служат заполнителями так же, как и переменные, мне кажется очень странным, что метод должен возвращать имя переменной. Я что-то упустил здесь?
Кроме того, мне непонятно, почему я могу привести суперкласс к ParameterizedType, но не к самому классу. Попытка привести результат li.getClass() к типу ParameterizedType приводит к следующей ошибке времени компиляции:
требуется: ParameterizedType найден: Класс, где CAP#1 является новой переменной типа: CAP#1 расширяет список из захвата ? расширяет список
Я видел этот соответствующий пост SO, но он меня не просветил.