Приведение массива объектов к массиву ошибок 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;

5 ответов

Решение

Росс, вы также можете использовать 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;

Вы не можете разыграть 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[] в Object[])!

Или сделайте следующее:

...

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

  return integerArray;

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

Вы пытаетесь разыграть Массив Объектов, чтобы разыграть Массив Целых. Вы не можете сделать это. Этот тип ударов не разрешен.

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

Когда приведение выполняется в Java, компилятор Java, а также среда выполнения Java проверяют, возможно ли приведение, и выдает ошибки, если нет.

Когда происходит приведение типов объектов, instanceof тест должен пройти для того, чтобы задание прошло. В вашем примере это приводит
Object[] a = new Object[1]; boolean isIntegerArr = a instanceof Integer[]
Если вы делаете sysout из приведенной выше строки он вернул бы false;
Так что попытка экземпляра проверки перед кастингом поможет. Итак, чтобы исправить ошибку, вы можете добавить проверку instanceof
ИЛИ ЖЕ
используйте следующую строку кода:
(Arrays.asList(a)).toArray(c);

Обратите внимание, что приведенный выше код не будет работать, если массив Object содержит любую запись, отличную от Integer.

Другие вопросы по тегам