Considérez cet exemple (typique dans les livres OOP):
J'ai une Animal
classe, où chacun Animal
peut avoir beaucoup d'amis.
Et les sous - classes aiment Dog
, Duck
, Mouse
etc qui ajoutent des comportements spécifiques comme bark()
, quack()
etc.
Voici la Animal
classe:
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);
}
}
Et voici un extrait de code avec beaucoup de transtypage:
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-t-il un moyen d'utiliser des génériques pour le type de retour pour me débarrasser de la conversion de type, afin que je puisse dire
jerry.callFriend("spike").bark();
jerry.callFriend("quacker").quack();
Voici un code initial avec un type de retour transmis à la méthode en tant que paramètre qui n'est jamais utilisé.
public<T extends Animal> T callFriend(String name, T unusedTypeObj){
return (T)friends.get(name);
}
Existe-t-il un moyen de déterminer le type de retour à l'exécution sans utiliser le paramètre supplémentaire instanceof
? Ou au moins en passant une classe du type au lieu d'une instance factice.
Je comprends que les génériques sont destinés à la vérification du type de compilation, mais existe-t-il une solution à cela?