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
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!