Considere este exemplo (típico nos livros de POO):
Eu tenho uma Animal
aula, onde cada um Animal
pode ter muitos amigos.
E subclasses como Dog
, etc Duck
, Mouse
que adicionam comportamento específico bark()
, quack()
etc.
Aqui está a Animal
turma:
public class Animal {
private Map<String,Animal> friends = new HashMap<>();
public void addFriend(String name, Animal animal){
friends.put(name,animal);
}
public Animal callFriend(String name){
return friends.get(name);
}
}
E aqui está um trecho de código com muita tipografia:
Mouse jerry = new Mouse();
jerry.addFriend("spike", new Dog());
jerry.addFriend("quacker", new Duck());
((Dog) jerry.callFriend("spike")).bark();
((Duck) jerry.callFriend("quacker")).quack();
Existe alguma maneira de usar genéricos para o tipo de retorno para me livrar da conversão de texto, para que eu possa dizer
jerry.callFriend("spike").bark();
jerry.callFriend("quacker").quack();
Aqui está um código inicial com o tipo de retorno transmitido ao método como um parâmetro que nunca é usado.
public<T extends Animal> T callFriend(String name, T unusedTypeObj){
return (T)friends.get(name);
}
Existe uma maneira de descobrir o tipo de retorno em tempo de execução sem o parâmetro extra usando instanceof
? Ou pelo menos passando uma classe do tipo em vez de uma instância fictícia.
Entendo que os genéricos são para verificação de tipo em tempo de compilação, mas existe uma solução alternativa para isso?