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
Libérer: 2024-12-31 06:20:10
original
645 Les gens l'ont consulté

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

Copier après la connexion

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

Copier après la connexion

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) {
    // ...
}

Copier après la connexion

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

Copier après la connexion

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!

source:dev.to
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