1
resposta

ClassCastException em arrays, mas não em variáveis normais.

Por que recebo uma exception na linha 05 se removo a linha 3? Se eu usar variáveis normais (linha 06 à frente), isso não acontece. Por que não tenho o mesmo problema na linha 10?

01  Object objArray[] = new Object[1]; // objArray[0] == null
02  String strArray[] = new String[1]; // strArray[0] == null too
03  objArray = strArray; // Se eu removo esta linha, é lançada a exception na linha 5
04  objArray[0] = new String("abcd"); 
05  strArray = (String[]) objArray; //java.lang.ClassCastException, se a linha 3 for removida

06  //Mesmo código acima, mas com variáveis normais   
07  Object obj = null;
08  String str = null;
09  obj = new String("abcd");
10  str = (String) obj; // nenhuma excessão aqui
1 resposta

Oi GREGORI

Quando você executa essa linha:

objArray = strArray; 

Basicamente você está sobreescrevendo o valor de objArray com strArray. Como objArray é um array de Object, você pode jogar um array de String para ele armazenar, sem problemas.

Quando você faz o cast nessa linha:

strArray = (String[]) objArray; 

Basicamente o que você está falando para o compilador é "eu sei que em tempo de execução o que vai ter no objArray é um array de String, então por favor, não dê erro de compilação.

Porém, objArray será um array de string apenas se você executar

objArray = strArray; 

Se você remover a linha acima, o valor de objArray será um array de object:

Object objArray[] = new Object[1]; 

E portanto, um array de object não pode ser convertido via cast para um array de string, é por isso que estoura ClassCastException.