Maison >Java >javaDidacticiel >Pourquoi Java empêche-t-il la duplication de signature de méthode après un effacement générique ?

Pourquoi Java empêche-t-il la duplication de signature de méthode après un effacement générique ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-25 16:56:13902parcourir

Why Does Java Prevent Method Signature Duplication After Generic Erasure?

Duplication de signature de méthode et effacement générique

En Java, il n'est pas permis de déclarer deux méthodes au sein de la même classe qui ont le même effacement après avoir appliqué l’effacement de type à leurs types génériques. Cette restriction résulte du risque de conflits avec le code existant qui utilise des types bruts.

Considérons l'exemple suivant :

class Test {
   void add(Set<Integer> ii) {}
   void add(Set<String> ss) {}
}

Ce code déclencherait l'erreur de compilation : "Method add(Set) a le même effacement add(Set) qu'une autre méthode de type Test."

Pour comprendre la justification de cette restriction, traçons l'évolution d'un hypothétique base de code :

Initialement, avant l'introduction des génériques en Java, le code suivant aurait pu être écrit :

class CollectionConverter {
  List toList(Collection c) {...}
}

Par la suite, une extension de cette classe a été créée :

class Overrider extends CollectionConverter {
  List toList(Collection c) {...}
}

Avec l'introduction des génériques, la classe CollectionConverter a été mise à jour :

class CollectionConverter {
  <T> List<T> toList(Collection<T> c) {...}
}

Cependant, le La classe de remplacement est restée inchangée. Pour continuer à remplacer correctement la méthode toList(), il a été décidé que les types bruts étaient « équivalents au remplacement » des types générés.

Plus tard, le développeur d'Overrider a tenté de mettre à jour la classe mais a ajouté une nouvelle méthode à côté de la méthode toList(). méthode toList brute existante :

class Overrider extends CollectionConverter {
  @Override
  List toList(Collection c) {...}
  @Override
  <T> List<T> toList(Collection<T> c) {...}
}

En raison de l'équivalence de remplacement des types bruts, les deux méthodes pourraient potentiellement remplacer la toList(Collection). Cependant, cette ambiguïté devait être résolue pour le compilateur.

Pour éviter de tels conflits, le langage Java restreint l'existence de plusieurs méthodes avec le même effacement au sein d'une même classe. Cela garantit que les développeurs peuvent remplacer les méthodes en toute confiance sans introduire d'ambiguïté causée par le code existant qui utilise des types bruts.

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