Dúvida Array de Object

Boa noite.
a esta hora não consigo mais pensar em nada pra entender esse código.

1-
Object [] object = new Object[5][5]; //Esse código é valido, compila e executa sem problemas
2-
Integer [] arrayInteger = new Integer[5][5]; // esse dá erro de compilação

A minha dúvida é que a atribuição [][] me parece que está tentando criar um array 2D sendo que o tipo que eu declarei é [] 1 D apenas.
No segundo codigo o compilador diz: Type mismatch: cannot convert from Integer[][] to Integer[]
Eu testei vários tipos primitivos e não funciona, só com Object que dá certo.

Apelei e fiz isso, e pior que funciona:

To ficando louco ou isso realmente compila???

Alguem pode me ajudar??

Obrigado.

1-
Object object = new Object[5][5];

Isso também funciona. Consegue enxergar o porque agora?

[quote]menphis 1. 1-
2. Object object = new Object[5][5];

1- Object object = new Object[5][5];
Isso também funciona. Consegue enxergar o porque agora?[/quote]

Eu acho que não entendi direito podias ser mais claro, porque no forum tem iniciantes como eu que não entendemos a idea :idea: :slight_smile: ,
mas tendando pensar sem saber se estou certo ou errado, é o seguinte quando se fala da classe Object ela pode aceitar todo o tipo de dados possiveis seja objecto ou primitivo, então por isso aceitou o array, sera isso???

A pegadinha é que Object[] extends Object, por isso essa coisa estranha surge. Como Integer[] não herda de Integer, esse problema não surge desta forma, mas Integer[] “herda” de Object[], então ainda dá para ter problemas semelhantes usando Integer[]. (coloquei o herda entre aspas porque não é exatamente isso que ocorre, mas é o efeito que se tem na prática).

Vejamos isso:
Object[] object = new Object[5][4];

A variável object vai virar um array com 5 elementos, e em cada posição do array pode ser colocado um Object.
Cada posição desse array será inicializada com um objeto do tipo Object[], contendo 4 posições.

Enfim, essa é uma esquisitice da linguagem que na prática não serve para nada. Na verdade acredito que isso nem seja intencional e tenha surgido como um efeito colateral acidental da forma como a linguagem trabalha arrays.

Java não é uma linguagem perfeita e contém alguns erros de projeto. Alguns destes erros estão no tratamento de arrays, que fazem surgir coisas bem estranhas.

Se você está estudando para a prova de certificação, pode ficar mais tranquilo porque esse tipo de maluquice não é cobrada. Você verá códigos manipulando arrays e matrizes, mas nenhum fazendo esse tipo de coisa aí.

Essa foi uma questão de um mock CertPal, um dos indicados do JavaRanch.

Eu não entendi ainda o motivo que funciona, mas eu já sei que se ver isso na prova vai compilar se o tipo for Object.
No mock eu errei pq marquei que não compilava.

Valeu pessoal pelas respostas.

A explicação é simples.

Tudo o que está instanciado em java é um objecto.

Portanto:
Object a;
a = new Xpto[4]; // Válido

Object [] b = new Xpto[3][4];
Só quer dizer que:
Object b0, b1, b2;
b0 = new Xpto[4]; // igual para b[0]
b1 = new Xpto[4]; // igual para b[1]
b2 = new Xpto[4]; // igual para b[2]

Ou seja, eu não vou poder referenciar um Xpto directamente de (b[0])[3] , mas vou poder fazer:

Xpto [] k;
Xpto l;
k = (Xpto []) b[0];
l = k[3];

Espero que tenha dado alguma luz.

Resumindo, tudo em java tudo é objecto. Depois é só uma questão de ter "cast"s válidos.

Abraços,
Paulo

PS: Não pude testar o código, por isso pode ter falhas, mas o princípio é esse

Minha justificativa é simples, todo Array é um objeto, na verdade tudo exceto os primitivos são objetos, e você ainda pode “empacotar” um primitivo num objeto.
Pra você entender, é só olhar o que o objeto está fazendo referência na verdade, tente percorrer o array para perceber.

Primeiramente, muito obrigado pela ajuda.
Ontem eu realmente achei que estava em outro planeta quando ví essa declaração.

Pois bem.

Object [] objetoArray2D = new Object[3][4];

 for(Object o: objetoArray2D){
         Object [] objetoArray1D = (Object[]) o;

	 for(Object objeto: objetoArray1D){
	         System.out.print(objeto + " ");
	  }
 } //Imprime 12 x null - cada posição do array 1D

O que eu entedi é que isso só funciona pois Object é a classe raiz de todo e qualquer objeto em Java.

Então o tipo Object pode ser referênciar qualquer objeto no planeta Java, pois sempre estará ACIMA na árvore de herança, e um Super Tipo sempre pode referênciar um objeto do subtipo.

Me corrijam se eu estiver enganado.

Estas certissimo, não tem outra explicação possivel, é por Object se o objecto pai de todos