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.
[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: ,
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.
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.