Considérons cet exemple (typique en programmation orientée objet, des livres):
J'ai un Animal de la classe, où chaque Animal peut avoir beaucoup d'amis.
Et les sous-classes comme le Chien, le Canard, Souris, etc, qui ajoutent un comportement spécifique, comme bark()
, quack()
etc.
Voici l'Animal de la classe:
public class Animal {
private Map<String,Animal> friends = new HashMap<String,Animal>();
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 typecasting:
Mouse jerry = new Mouse();
jerry.addFriend("spike", new Dog());
jerry.addFriend("quacker", new Duck());
((Dog) jerry.callFriend("spike")).bark();
((Duck) jerry.callFriend("quacker")).quack();
Est il possible que je peux utiliser des génériques pour le type de retour pour se débarrasser de la typecasting, de sorte que je peux dire
jerry.callFriend("spike").bark();
jerry.callFriend("quacker").quack();
Voici quelques code initial avec le type de retour transmis à la méthode comme un paramètre qui n'est jamais utilisé.
public<T extends Animal> T callFriend(String name, T unusedTypeObj){
return (T)friends.get(name);
}
Est-il un moyen de comprendre le type de retour à l'exécution sans le paramètre supplémentaire à l'aide de instanceof
? Ou au moins par le passage d'une catégorie du type, au lieu d'une instance fictive.
Je comprends les génériques sont pour moment de la compilation, la vérification de type, mais est-il une solution pour cela?