Maison >Java >javaDidacticiel >Comment les génériques peuvent-ils éliminer le transtypage lors de la récupération d'objets à partir de collections hétérogènes ?
Surmonter le transtypage avec des génériques dans les types de retour
Dans la programmation POO, les classes maintiennent souvent des collections d'objets associés. Par exemple, une classe Animal peut conserver une liste d'amis, qui peuvent être des instances de diverses sous-classes telles que Dog et Duck.
Traditionnellement, récupérer des amis spécifiques à partir de cette liste nécessite un transtypage en raison de la nature hétérogène de la collection. Cela donne un code comme :
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 éviter ce transtypage fastidieux, envisagez d'utiliser des génériques pour rendre le type de retour de la méthode callFriend spécifique à la sous-classe correcte. Cependant, dans ce scénario spécifique, spécifier le type de retour en tant que paramètre tel que :
public <T extends Animal> T callFriend(String name, T unusedTypeObj) { return (T)friends.get(name); }
n'est pas utile car le paramètre de type inutilisé ne fournit aucune information supplémentaire au moment de l'exécution.
Au lieu de cela, une solution de contournement implique de passer la classe du type souhaité en argument à callFriend :
public <T extends Animal> T callFriend(String name, Class<T> type) { return type.cast(friends.get(name)); }
Avec cette implémentation, la méthode call devient :
jerry.callFriend("spike", Dog.class).bark(); jerry.callFriend("quacker", Duck.class).quack();
Cette solution élimine le transtypage à l'exécution et garantit que l'objet renvoyé peut être converti en toute sécurité vers la sous-classe souhaitée.
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!