[Resolvido] Dúvida Polimorfismo Objeto do tipo Object

Estou com uma duvida em Polimorfismo. Porque se eu fizer um arrayList do tipo Object… e colocar um objeto dog la dentro… porque não posso depois instanciar oque tem dentro da arrayList para algum outro local?
Exemplo:

ArrayList<Object>myDogArrayList = new ArrayList<Object>();
Dog aDog = new Dog();
myDogArrayList.add(aDog);
Dog d = myDogArrayList.get(aDog);//<<Essa linha não funciona... Porque???

tenta fazer um cast

Dog d = (Dog) myDogArrayList.get(aDog);

[]'s

[quote=denisspitfire]Estou com uma duvida em Polimorfismo. Porque se eu fizer um arrayList do tipo Object… e colocar um objeto dog la dentro… porque não posso depois instanciar oque tem dentro da arrayList para algum outro local?
Exemplo:

ArrayList<Object>myDogArrayList = new ArrayList<Object>(); Dog aDog = new Dog(); myDogArrayList.add(aDog); Dog d = myDogArrayList.get(aDog);//<<Essa linha não funciona... Porque??? [/quote]

Quando você cria um ArrayList, você está criando uma estrutura do tipo ArrayList, com variáveis de referência do tipo Object.
Os generics fazem isso pra você: cria variáveis de referência tipo Object.

Então a mesma coisa acontece nesse caso abaixo:

Object obj = new Dog();
Dog aDog = obj; // << Essa linha também não funciona, porque obj é de um tipo incompatível com o tipo aDog.

Como o alex.brito disse, você deve fazer um cast.

Se o ArrayList é de Objects, você poderá qualquer coisa dentro dele. Dogs, Computers, Houses, Strings… qualquer coisa.

Quem garante que na hora do get, você está pegando um Dog? No seu exemplo, simples demais, fica bastante óbvio que o que você recebe é um Dog. Mas considere um caso um pouco mais complexo:

lista.add(gato1); lista.add(cachorro1); lista.add(gato2); lista.add(cachorro2); Collections.sort(lista); //Ordena a lista por um critério que desconhecemos Dog x = lista.get(0); //Será que tem mesmo um cachorro aqui?

então eu poderia dar um getclass… e depois com esse resultado fazer um cast?

Pode sim, para isso você usa o operador instanceof:

Object objeto = lista.get(0); if (objeto instanceof Dog) { Dog dog = (Dog)objeto; //Agora sim, sabemos que é um cachorro darRacao(dog); }

Obrigado.

Só mais uma sutileza. Use o getClass() se você quiser testar se duas classes são exatamente a mesma.
Por exemplo, considere que Chiwawa extends Dog:

[code]Dog obj = new Chiwawa();

objeto.getClass() == Chiwawa.class; //True, o objeto é um Chiwawa
objeto.getClass() == Dog.class; //False, a classe do objeto não foi declarada como Dog, e sim como Chiwawa.
objeto instanceof Dog //True, o objeto não foi decladado como Dog. Mas, devido à herança, todo Chiwawa É UM Dog.[/code]

Achei um exemplo interessante só para reforçar.
Digamos que os extends sejam camadas… Logo…

classe 1 (2 métodos) > classe 2(3metodos+2metodos da classe 1logo… a classe 2 tem 5 metodos.)

Se voce quer… tratar uma classe 2 como classe 1… voce perderá os 3 métodos da classe 2…

Igual quando voce tenta colocar um valor float… dentro de um int.