Maison >interface Web >js tutoriel >Erreurs d'ambiguïté avec les génériques

Erreurs d'ambiguïté avec les génériques

Barbara Streisand
Barbara Streisandoriginal
2024-12-31 06:20:10650parcourir

Erros de Ambiguidade com Genéricos

1. Que sont les erreurs d’ambiguïté ?

  • Se produit lorsque l'effacement transforme deux déclarations génériques apparemment distinctes en types identiques, provoquant des conflits de compilation.
  • Ils sont particulièrement courants dans les scénarios impliquant une surcharge de méthodes.

2. Exemple d'ambiguïté : surcharge d'effacement

Code problématique :

class MyGenClass<T, V> {
    T ob1;
    V ob2;

    // Tentativa de sobrecarga
    void set(T o) {
        ob1 = o;
    }

    void set(V o) {
        ob2 = o;
    }
}

Erreur : La tentative de surcharge de la méthode set() basée sur les paramètres génériques T et V semble valide, mais provoque une ambiguïté.

3. Raisons de l'ambiguïté

  • Premier problème : T et V peuvent être du même type.

Exemple :

MyGenClass<String, String> obj = new MyGenClass<>();

Ici, T et V sont remplacés par String, rendant les deux versions de set() identiques.

Résultat :

  • Le compilateur ne peut pas faire la distinction entre les deux méthodes.

Deuxième problème : L'effacement réduit les types en Objet.

  • Lors de la compilation, les deux méthodes sont transformées en :
void set(Object o) {
    // ...
}

Cela élimine toute distinction entre T et V, rendant la surcharge impossible.

4. Pourquoi cela se produit-il ?

  • Erasure supprime les informations de type générique, en les remplaçant par ses types de limites (ou Objet si aucune limite n'est spécifiée).
  • Dans le cas de set(T) et set(V), les deux finissent par être traités comme set(Object) dans le code généré par le compilateur.

5. Solution : évitez les surcharges génériques
Pour résoudre l'ambiguïté, utilisez des noms différents pour les méthodes.

Exemple corrigé :

class MyGenClass<T, V> {
    T ob1;
    V ob2;

    void setOb1(T o) {
        ob1 = o;
    }

    void setOb2(V o) {
        ob2 = o;
    }
}

Ici, setOb1() et setOb2() sont des méthodes distinctes, éliminant le conflit.

6. Conclusion
Des ambiguïtés comme celle-ci se produisent car l'effacement transforme les paramètres génériques en types simples (Objet).
Pour éviter les erreurs, suivez ces pratiques :

  • Évitez de surcharger les méthodes avec des paramètres génériques.
  • Donnez des noms différents aux méthodes qui manipulent différents types génériques. Comprendre le comportement d'effacement permet d'éviter ces problèmes et de concevoir des classes génériques en toute 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