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=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.
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?
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]