Curiosidade no uso de Arrays

Minha duvida esta nessa pequena atribuição feita entre um Array muldimensional de inteiros a uma referencia a Object.
Na minha cabeça para eu fazer essa atribuição eu teria q declarar a variavel de referencia sendo um Object tambem multidimensional (Object [] [])
Porem quando declaro dessa maneira o copilador não aceita. E quando eu declaro ele sendo apenas um Array simples (Object []) o copilador aceita normalmente.
Porque ?

Copilador Aceita Atribuição

int [][] teste = {{1234},{1234}}; Object [] x = teste;

Copilador NÃO Aceita Atribuição

int [][] teste = {{1234},{1234}}; Object [][] x = teste;

Deve ser porque, na verdade, você esta armazenando uma referência de um objeto array.

Bem, vamos lá. Siga o código abaixo e os comentários, bem como as imagens que estou postando.

[code]
// 1
int[][] teste = { { 1234 }, { 1234 } };

// 2
Object[] x = teste;

// 3
Object[] y = { teste };

System.out.println( teste );
System.out.println( x );
System.out.println( y );
System.out.println( x.length );
System.out.println( y.length );

System.out.println( ( ( int[] ) x[0] )[0] );
System.out.println( ( ( int[][] ) y[0] )[0][0] );[/code]

1 - São criados dois arrays de inteiros de uma posição, sendo que nessa posição - em ambos arrays - está contido o valor 1234 (primitivo). Esses dois arrays são usados para preencher um outro array, agora de duas posições, que consegue armazenar arrays de inteiros. Por fim, a variável teste, do tipo “array que armazena array de inteiros” recebe o valor da referência à esse array criado por último. Veja a imagem 1.

2 - Atribui-se à variável x (do tipo array de Object), o endereço que a variável teste armazena. Mas ai você pergunta. teste é um array “multimensional”, enquanto x é um array unidimensional, pq não dá problema? Na verdade, não existem arrays multidimensionais. Um array que parece multidimensional, na verdade é um array normal, que armazena em suas posições outros arrays. Então, não há problema algum em atribuir t[][] à z[], pois o que z[] vai receber é o endereço de t[]. Analise a saída do código que passei e veja a imagem 2.

3 - Cria-se um array do tipo Object, de uma posição, onde o valor dessa posição pode ser um object. Como arrays são objetos (mesmo se forem arrays de primitivos), a posição 0 do array criado aponta para o valor de teste. O endereço desse array criado é atribuido à variável y. Veja a imagem 3 abaixo.

Sabendo disso, analise o seguinte. O que “Object[][] z” pode armazenar? “Object[][] z” pode armazenar uma referência para um array de arrays de Object. teste é do tipo array de arrays de inteiros certo? O problema é que int é um primitivo, enquanto Object não é. Por isso a incompatibilidade de tipos. Se você tentar algo igual ao código abaixo, você vai ver que vai funcionar, pois String é um Object.

[code]int[][] teste = { { 1234 }, { 1234 } };
String[][] teste2 = { { “b” }, { “c” } };

Object[] x = teste;
Object[] y = { teste };

Object[][] z = teste2;

System.out.println( teste );
System.out.println( teste2 );
System.out.println( x );
System.out.println( y );
System.out.println( z );
System.out.println( x.length );
System.out.println( y.length );
System.out.println( z.length );

System.out.println( ( ( int[] ) x[0] )[0] );
System.out.println( ( ( int[][] ) y[0] )[0][0] );
System.out.println( z[0][0] );[/code]

Note que coloquei tantos os objetos quanto as referências no mesmo “local” nos diagramas e que tratei os inteiros como objetos, mas na verdade não é assim. Fiz dessa forma visando a simplicidade. Se alguém quiser contribuir com mais detalhes, fiquem à vontade. :smiley:

[]´s





Valeu pela detalhada explicação.
Nem precisa falar que ta mais que entendido :smiley: