Почему приведение Type [] к Class [] вызывает исключение ClassCastException? - PullRequest
3 голосов
/ 09 сентября 2010

Сегодня я писал какой-то тяжелый код с использованием рефлексии, и я столкнулся с таким поведением, которое я не могу объяснить: почему

Type[] types = ((ParameterizedType)m.getGenericReturnType()).getActualTypeArguments();
Class[] c = (Class[])types;

Создайте исключение ClassCastException при итерации по тому же массиву и приведении каждого отдельного элемента, т.е.

for(Type t : types) {
    Class c = (Class)t;
}

успешно

Я имею в виду, если приведение одного элемента к другому классу возможно, почему невозможно также приведение между массивами одного типа?

Возможно, есть причина, но я не могу ее найти ...

Ответы [ 3 ]

5 голосов
/ 09 сентября 2010

Вы не можете разыграть Type[] до Class[], потому что Type[] не является Class[]. Это может звучать тривиально, но это все, что нужно сделать.

Если бы вы могли привести Type[] к Class[], что бы вы ожидали, если бы одним из его элементов был Type, а не Class (например, ParameterizedType)?

1 голос
/ 09 сентября 2010

Имейте в виду, что для приведения к Class[] объект должен быть на самом деле Class[], а не Type[].Например, это не удастся:

Object[] objArr = new Object[10];
Integer[] intArr = (Integer[])objArr;  // fail.

, но это будет работать:

Object[] objArr = new Integer[10];
Integer[] intArr = (Integer[])objArr;
0 голосов
/ 09 сентября 2010

Вы не можете привести весь массив, потому что нет гарантии, что все элементы в массиве имеют тип Class. Что, если одним из них была какая-то другая реализация Type?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...