Pessoal estou estudando para o exame OCJP 1.6.
Porém não consegui entender porque esse codigo não funciona alguem pode me ajudar?
import java.util.*;
class Doctor{
public void tratarAnimal(List<? extends Animal> animals){
animals.makeNoise();
}
}
class Animal{
public void makeNoise(){
System.out.println("Animal");
}
}
class Dog extends Animal{
public void makeNoise(){
System.out.println("DOG");
}
}
class Cat extends Animal{
public void makeNoise(){
System.out.println("Cat");
}
}
public class TestClass{
public static void main(String [] args){
ArrayList<Dog> dog = new ArrayList<Dog>();
ArrayList<Cat> cat = new ArrayList<Cat>();
dog.add(new Dog());
cat.add(new Cat());
new Doctor().tratarAnimal(dog);
new Doctor().tratarAnimal(cat);
}
}
Vc tá chamando o makenoise do objeto animal. Só que animal é List e lista não estende animal e sim o seu tipo parametrizado.
Na vedd nao entendi o que vc ta querendo fazer .
Veja bem, dentro da classe Doctor temos o método tratarAnimal. Este método recebe um list<? extends Animal>. Logo após ele chama um método de um objeto dentro de tratarAnimal.
Qual é o tipo deste objeto?
Este objeto possui este método que está sendo chamado?
O problema tem realmente algo a ver com o coringa do Generics?
Observe isso, nunca fiz o exame, mas sei que eles capricham na hora de gerar um código que não compila devido a outros problemas para pegar na sua atenção.
Vejam o que eu tentei testar com esse codigo e passar um list poliformico assim, poderia passar qualquer tipo parametizado que estendesse animal como ex: e seria possivel no metodo chamar o metodo makenoise que foi implementado em animal por isso tanto Dog quanto Cat teria como chamar esse metodo.
Por exemplo esse trechos de codigo usa o mesmo conceito e funciona:
public void addAnimal(List<? super Dog> dog){
dog.add(new Dog());
}
public void showAnimal(List<?> a){
int size = a.size();
System.out.println(size);
}
}
Ou seja eu consigo passar para o metodo um list ou e chamar o metodo size neles de forma poliformica, porém chamar o metodo makenoise que foi implementado em Animal eu não consigo chamar, pode ate ser um erro besta mais não consegui entender.
Presta atenção aqui:
class Doctor{
public void tratarAnimal(List<? extends Animal> animals){
animals.makeNoise();
}
}
Você não está chamando o método de uma classe que estende Animal. Você está chamando esse método em um Objeto do tipo List. Você tem que fazer uma iteração nessa lista para pegar cada objeto contido nela e executar o método.
Nossa cara realmente, e que estava escrevendo direto no notepad que acho melhor para assimilar de verdade e não percebi que não estava fazendo um get no conjunto para ai sim utilizar a referencia a um objeto animal. Vlw.