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
Barbara Streisandoriginal
2024-12-11 14:21:17377parcourir

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);
    }
}

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!

Déclaration:
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