Comment éliminer la conversion de type dans les types de retour de méthode générique
Considérez un scénario POO classique : une classe Animal avec diverses sous-classes comme Dog, Duck et la souris, chacune avec des comportements uniques. Chaque animal peut avoir une collection d'amis, leur permettant d'interagir les uns avec les autres.
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); } }
Cependant, récupérer le comportement spécifique d'un ami nécessite un transtypage, comme le montre cet extrait de code :
Mouse jerry = new Mouse(); jerry.addFriend("spike", new Dog()); jerry.addFriend("quacker", new Duck()); ((Dog) jerry.callFriend("spike")).bark(); ((Duck) jerry.callFriend("quacker")).quack();
Pour éliminer ce transtypage, des génériques peuvent être utilisés pour créer le type de retour de la méthode callFriend flexible.
public <T extends Animal> T callFriend(String name, T unusedTypeObj) { return (T) friends.get(name); }
Bien que cette approche transmette le type de retour à la méthode en tant que paramètre inutilisé, une solution plus élégante consiste à déterminer le type de retour au moment de l'exécution.
Une façon d'y parvenir est en modifiant la méthode callFriend :
public <T extends Animal> T callFriend(String name, Class<T> type) { return type.cast(friends.get(name)); }
Cela vous permet d'appeler la méthode comme suit :
jerry.callFriend("spike", Dog.class).bark(); jerry.callFriend("quacker", Duck.class).quack();
Cette méthode n'offre l'avantage d'aucun avertissement du compilateur, mais il s'agit essentiellement d'une version mise à jour du casting pré-générique et n'améliore pas la sécurité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!