Surmonter la conversion de type dans les types de retour de méthode avec des génériques
Dans la programmation orientée objet, il est courant d'utiliser l'héritage pour modéliser différents types d'objets ayant des caractéristiques communes. Prenons l'exemple d'une classe Animal où chaque animal peut avoir une variété d'amis. Chaque sous-classe d'animaux, comme le chien, le canard et la souris, ajoute ses propres comportements spécifiques.
Le problème :
En utilisant l'approche traditionnelle, accéder au comportement spécifique de un ami animal nécessite un casting de type explicite, comme le montre l'extrait de code utilisant la classe Animal. Cette approche peut devenir lourde et introduit un risque d'erreurs.
L'objectif :
L'objectif est d'éliminer le besoin de conversion de type en tirant parti des génériques pour le retour de la méthode. tapez, permettant un accès direct au comportement souhaité.
Le Solution de contournement :
Malgré les limitations des génériques pour la vérification du type d'exécution, une solution de contournement existe. Voici comment la méthode callFriend peut être révisée à l'aide du paramètre de type générique T :
public <T extends Animal> T callFriend(String name, Class<T> type) { return type.cast(friends.get(name)); }
Utilisation :
La méthode callFriend révisée peut ensuite être appelée de la manière suivante :
jerry.callFriend("spike", Dog.class).bark(); jerry.callFriend("quacker", Duck.class).quack();
Avantages :
Cette approche élimine la conversion de type et permet un accès direct aux comportements appropriés. De plus, cela garantit que le compilateur vérifie que l'argument de type transmis à callFriend est un sous-type d'Animal, ce qui améliore la sécurité.
Limitations :
Bien que cette solution de contournement concerne le type problème de casting, il convient de noter qu'il n'applique pas réellement la vérification du type d'exécution. Néanmoins, cela reste une solution utile pour les scénarios où les types sont bien connus et où le casting précis est assuré.
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!