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