Cast de matriz de objects para erro de matriz inteira

O que há de errado com o código a seguir?

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

O código tem o seguinte erro na última linha:

Exceção no segmento “main” java.lang.ClassCastException: [Ljava.lang.Object; não pode ser convertido em [Ljava.lang.Integer;

Ross, você pode usar Arrays.copyof () ou Arrays.copyOfRange () também.

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

Aqui o motivo para acertar um ClassCastException é que você não pode tratar uma matriz de Integer como uma matriz de Object . Integer[] é um subtipo de Object[] mas Object[] não é um Integer[] .

E o seguinte também não dará uma ClassCastException .

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

Você não pode converter um array Object para um array Integer . Você tem que percorrer todos os elementos de um e lançar cada um individualmente.

 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]; } 

Edit: Acredito que a lógica por trás desta restrição é que, quando a transmissão, a JVM quer garantir a segurança do tipo em tempo de execução. Como uma matriz de Objects pode ser qualquer coisa além de Integers , a JVM teria que fazer o que o código acima está fazendo de qualquer maneira (veja cada elemento individualmente). Os designers de linguagem decidiram que não queriam que a JVM fizesse isso (não sei por que, mas tenho certeza que é uma boa razão).

No entanto, você pode converter uma matriz de subtipo em uma matriz de supertipo (por exemplo, Integer[] para Object[] )!

Ou faça o seguinte:

 ... Integer[] integerArray = new Integer[integerList.size()]; integerList.toArray(integerArray); return integerArray; } 
 java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer; 

você tenta converter um Array of Object para converter em Array of Integer. Você não pode fazer isso. Este tipo de downcast não é permitido.

Você pode criar uma matriz de Integer e, depois disso, copiar todos os valores da primeira matriz na segunda matriz.

Quando a conversão é feita em Java, o compilador Java, bem como o tempo de execução Java, verifica se a conversão é possível ou não e lança erros, caso contrário.

Quando a conversão de tipos de object está envolvida, a instanceof teste deve passar para que a atribuição seja executada. No seu exemplo, isso resulta
Object[] a = new Object[1]; boolean isIntegerArr = a instanceof Integer[]
Se você fizer um sysout da linha acima, ele retornará false;
Então, tentar uma instância de check antes do casting ajudaria. Assim, para corrigir o erro, você pode adicionar a verificação “instanceof”
OU
use a seguinte linha de código:
(Arrays.asList(a)).toArray(c);

Por favor, note que o código acima falhará, se a matriz de objects contiver qualquer input diferente de Integer.