Olá, pessoal. Eu estou estudando polimorfismo e não peguei muito bem ainda a lógica.
Olha só o que eu fiz, quero fazer os métodos únicos de Gato e Elefante rodar normal. Vou mostrar o que eu fiz para vocês entenderem.
void mostraAnimal(Animal a) {
if (a instanceof Animal) {
Gato gato = (Gato) a;
gato.beber();
gato.comer();
}
if (a instanceof Animal) {
Elefante elefante = (Elefante) a;
elefante.beber();
elefante.comer();
}
}
public static void main(String[] args) {
CriaAnimal ca = new CriaAnimal();
Animal elefante = new Elefante();
Animal gato = new Gato();
ca.mostraAnimal(gato);
ca.mostraAnimal(elefante);
}
}[/code]
Esta aparecendo isso:
[red]Estou bebendo com minha lingua
Estou comendo ração
Exception in thread "main" java.lang.ClassCastException: Polimorfismo.Elefante cannot be cast to Polimorfismo.Gato
at Polimorfismo.CriaAnimal.mostraAnimal(CriaAnimal.java:15)
at Polimorfismo.CriaAnimal.main(CriaAnimal.java:28)
Java Result: 1[/red]
void mostraAnimal(Animal a) {
if (a instanceof Animal) {
Gato gato = (Gato) a;
gato.beber();
gato.comer();
}
if (a instanceof Animal) {
Elefante elefante = (Elefante) a;
elefante.beber();
elefante.comer();
}
O problema está nas instruções if, análise a pergunta para o primeiro if:
o objeto real que a variável de referencia “a” referencia é um objeto da classe Animal? sendo que o correto seria: o objeto real que a variável de referencia “a” referencia é um objeto da classe Gato?
deste modo a conversão Gato gato = (Gato) a; seria segura. O mesmo vale para o segundo if, sendo agora Elefante no lugar de Animal.
[quote=ViniGodoy]A graça está em fazer esse método efetivamente usando o polimorfismo:
void mostraAnimal(Animal a) {
animal.beber();
animal.comer();
}
Sem casts, sem nada.
E note que vai funcionar corretamente.
Com o instanceof, você não estará usando polimorfismo.[/quote]
Vini, o problema é que na classe Animal não tem o método comer. tugh, o que o Vini está querendo dizer é que se você usa um instance of perde o sentido do Polimorfismo, para o seu caso. O objetivo é que você utilize o método sem se preocupar com quem o implementa, seja gato, cachorro. A única pergunta, classe Animal também não deveria possuir o método “comer” ?
Se sim, basta adiciona-lo e a dica do Vini vai funcionar perfeitamente.
E não é somente uma dica, mas sim, o correto a ser feito.
Uma das utilidades do instanceof é quando você quer acessar um método mais especifico para aquele tipo de Animal e que não seja comum aos outros objetos por exemplo:
Gato, Cachorro, CachorroAdaptado, todos eles herdam de Animal porém, o CachorroAdaptado poderia tem um método comerAdaptado(), uma funcionalidade diferente dos demais objetos. Deste modo você poderia utiliza assim:
[code]void mostraAnimal(Animal a) {
animal.beber();
if( a instanceof CachorroAdaptado )
animal.comerAdaptado();
else{
animal.comer()
}
} [/code]
É claro que isto depende da situação, mas é uma utilidade do instanceof.
Valeu a todos, entendi já. O que eu queria era apenas testar como chamar um método que apenas tivesse em Cachorro e Gato, o nome comer foi o primeiro que veio a minha cabeça.
Mas vendo pela lógica, todos animais comem (eu axo ne hAIuhaia). nesse caso, teria que estar na classe Animal também…
Mas era isso, obrigado pela atenção de todos.