Подтвердить что ты не робот

Литье массив объектов в массив Integer

Что случилось со следующим кодом?

Object[] a = new Object[1];
Integer b=1;
a[0]=b;
Integer[] c = (Integer[]) a;

В последней строке кода есть следующая ошибка:

Исключение в потоке "main" java.lang.ClassCastException: [Ljava.lang.Object; не может быть применено к [Ljava.lang.Integer;

4b9b3361

Ответ 1

Росс, вы также можете использовать Arrays.copyof() или Arrays.copyOfRange().

Integer[] integerArray = Arrays.copyOf(a, a.length, Integer[].class);
Integer[] integerArray = Arrays.copyOfRange(a, 0, a.length, Integer[].class);

Здесь причина для удара ClassCastException заключается в том, что вы не можете рассматривать массив Integer как массив Object. Integer[] является подтипом Object[], но Object[] не является Integer[].

И следующее также не даст ClassCastException.

Object[] a = new Integer[1];
Integer b=1;
a[0]=b;
Integer[] c = (Integer[]) a;

Ответ 2

Вы не можете выделить массив Object в массив Integer. Вы должны пропустить все элементы a и отбросить каждый отдельно.

Object[] a = new Object[1];
Integer b=1;
a[0]=b;
Integer[] c = new Integer[a.length];
for(int i = 0; i < a.length; i++)
{
    c[i] = (Integer) a[i];
}

Изменить: Я считаю, что обоснование этого ограничения заключается в том, что при кастинге JVM хочет обеспечить безопасность типа во время выполнения. Поскольку массив Objects может быть чем-то кроме Integers, JVM должен был бы делать то, что делает вышеприведенный код (посмотрите на каждый элемент отдельно). Разработчики языка решили, что они не хотят, чтобы JVM делала это (я не уверен, почему, но я уверен, что это хорошая причина).

Однако вы можете применить массив подтипов к массиву супертипов (например, Integer[] to Object[])!

Ответ 3

Или выполните следующие действия:

...

  Integer[] integerArray = new Integer[integerList.size()];
  integerList.toArray(integerArray);

  return integerArray;

}

Ответ 4

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;

вы пытаетесь передать массив объектов для преобразования в массив Integer. Вы не можете это сделать. Этот тип downcast не разрешен.

Вы можете создать массив Integer и после этого скопировать каждое значение первого массива во второй массив.