Atribuir array para variável Object?

3 respostas
bruno_r_santana

Boa tarde galera,

Tenho umas dúvidas. Primeira dúvida:
No livro da Kathy Sierra tem esse código:

public class Dims {  
    public static void main(String args[]){  
        int[][] a = {{1,2}, {3,4}};  
        int[] b = (int []) a[1];  
        Object o1 = a;      //MINHA DÚVIDA
        int[][] a2 = (int [][]) o1;  
        int [] b2 = (int []) o1; //ERRO AQUI, MAS NÃO IMPORTA
        System.out.println(b[1]);  
    }  
}
Agora deem uma olhada nesse aqui:
int numbers[] = null;  
Integer x = numbers; //ERRO: Uncompilable source code - incompatible types

Minha dúvida é porque no primeiro bloco de código nós podemos atribuir um array bidimensional para uma variável de referência do tipo Object(que não é um array bidimensional) e no segundo bloco de código não podemos atribuir um array bidimensional de int para uma variável de referência do tipo Integer. Porque o primeiro está correto e porque o segundo não compila sendo que os 2 códigos são muito similares?

A segunda dúvida é parecida com a primeira. Segunda dúvida:
Porque a primeira linha abaixo compila e a segunda não, apesar da estrutura das linhas de código serem iguais?

Object[] e = new String[4]; //OK, compila  
Object[] o = new int[4]; //ERRO: Uncompilable source code - incompatible types

Qual a diferença das linhas abaixo?

Object o = new int[4]; //OK, compila  
Object[] o = new int[4]; //ERRO: Uncompilable source code - incompatible types

valeu galera!

3 Respostas

pdpbom

Object é o pai de todos ele recebe qualquer coisa …

você não consegue atribuir pq vc especifico um tipo de objeto “Integer” só vai receber objeto tipo Integer

são coisa completamente diferentes.

tipo pensa assim

voce pede pra uma pessoa ,

me da um animal, vc entrega pra ela um gato até ae ok vc n especifico oque vc queria.
agora imagine se vc pedisse me da um gato, e te dessem um cachorro , estaria certo ??? tipos diferente :wink:

da segunda eu n sei te explicar … vo ficar te devendo …confesso q fikei curioso tbem …

Andersonrms

Vou tentar explicar com as minhas palavras, se eu disser alguma besteira me corrijam.

Sobre essas duas linhas:

Object o = new int[4]; //OK, compila    
Object[] o = new int[4]; //ERRO: Uncompilable source code - incompatible types

Na primeira linha vc faz 3 coisas:

1 - Cria uma variável de referência do tipo Object.
2 - Instancia um array para armazenar int’s (primitivos). Você criou um objeto que conterá primitivos.
3 - Atribui o objeto criado à variável de referência do tipo Object.

Pq isso é possível?

Pelo fato de que todo array é um objeto. E todo objeto tem como super-tipo mais genérico o Object. Sendo assim vc pode atribuir qq tipo d objeto a uma variável do tipo Object.

Já na segunda linha vc fez quase q as mesmas coisas q na primeira, exceto por criar uma variável de referência para array de Object’s. Ou seja, essa variável de referência não é do tipo Object. Portanto, como o tipo da variável de referência e o tipo do objeto que você criou não são iguais e não tem relação de herança, ocorre erro de compilação. Seria quase a mesma coisa que você fazer isso:

String s = new Integer(1);
bruno_r_santana

Obrigado pessoal,

Entendi legal. Eu acabei postando em outro fórum também e traduzo abaixo uma das respostas que obtive lá:

"Você pode atribuir um int[] para uma variável Object pq todos arrays são objetos. Tudo é um Object, exceto os tipos primitivos.

Você não pode atribuir um array de ints para uma variável Integer, pq um array não é um Integer, e nunca será.

Agora vem a parte complicada. Arrays em Java são covariantes. Isso significa que você pode atribuir um array de alguma coisa para um array de um supertipo. String é um objeto, então você pode atribuir String[] para uma variável Object[]. ints no entanto não são Objects, ints são um tipo primitivo, portanto você não pode atribuir um array int[] para uma variável Object[]."

Link com a resposta original:
http://www.coderanch.com/t/581491/java/java/array-Object#2645616

Obrigado a todos, você são 10!!!

Abraços.

Criado 19 de maio de 2012
Ultima resposta 23 de mai. de 2012
Respostas 3
Participantes 3