ToArray класса List в Java - Почему я не могу преобразовать список "Integer" в массив "Integer"? - PullRequest
8 голосов
/ 02 сентября 2011

Я определил List<Integer> stack = new ArrayList<Integer>();

Когда я пытаюсь преобразовать его в массив следующим образом:

Integer[] array= stack.toArray();

Я получаю это исключение:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
Type mismatch: cannot convert from Object[] to Integer[].

Почему? Это точно такой же тип - от целого к целому. Это не так, как в этом общем случае, когда классы имеют отношение отец-сын

Я пытался сделать кастинг:

    Integer[] array= (Integer[]) stack.toArray();

Но здесь я получаю эту ошибку:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;

В чем проблема?

Ответы [ 3 ]

12 голосов
/ 02 сентября 2011

Из-за стирания типа ArrayList не знает своего универсального типа во время выполнения, поэтому он может дать вам только самый общий объект [].Вам нужно использовать другой метод toArray , который позволяет вам указать тип нужного вам массива.

Integer[] array= stack.toArray(new Integer[stack.size()]);
2 голосов
/ 02 сентября 2011

Способ сделать это так:

Integer[] array = stack.toArray(new Integer[stack.size()]);

Для записи, причина, по которой ваш код не компилируется, не просто стирание типа.Проблема в том, что List<T>.toArray() возвращает Object[], и он сделал это до того, как были введены дженерики.

1 голос
/ 02 сентября 2011

Сделайте это вместо:

Integer[] array = stack.toArray(new Integer[stack.size()]);

Нам нужно передать массив "seed" в качестве аргумента методу toArray.

...