Maison > Java > javaDidacticiel > Comment les génériques peuvent-ils éliminer la conversion de type lors de la récupération des amis des animaux ?

Comment les génériques peuvent-ils éliminer la conversion de type lors de la récupération des amis des animaux ?

Barbara Streisand
Libérer: 2024-12-11 14:21:17
original
382 Les gens l'ont consulté

How Can Generics Eliminate Type Casting in Animal Friend Retrieval?

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);
    }
}
Copier après la connexion

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();
Copier après la connexion

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);
}
Copier après la connexion

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));
}
Copier après la connexion

Cela vous permet d'appeler la méthode comme suit :

jerry.callFriend("spike", Dog.class).bark();
jerry.callFriend("quacker", Duck.class).quack();
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal