Évitement de surcharge avec l'effacement de méthode
Le code Java peut rencontrer une erreur indiquant que deux méthodes ont le même effacement. Pour comprendre cette erreur, considérons l'exemple suivant :
class Test { void add(Set<Integer> ii) {} void add(Set<String> ss) {} }
Le compilateur générerait une erreur indiquant que les deux méthodes d'ajout ont le même effacement. En effet, une fois les deux méthodes effacées pour supprimer les paramètres de type, les deux ont la signature add(Set).
Dans certains cas, la logique de ces méthodes peut se chevaucher, ce qui rend tentant de les remplacer par une seule méthode générique. méthode telle que :
public void add(Set<?> set) {}
Cependant, cela n'est pas toujours possible. De plus, cette approche devient problématique lorsque l'on tente de créer deux constructeurs qui acceptent des arguments avec ces types, car le renommage des constructeurs n'est pas autorisé.
Compatibilité des codes hérités
La raison pour laquelle plusieurs méthodes avec le même effacement ne sont pas autorisées, cela découle de l'objectif de Java de maintenir la compatibilité avec le code existant qui utilisait des types bruts. Par exemple, considérons la classe suivante écrite avant l'introduction des génériques :
class CollectionConverter { List toList(Collection c) {...} }
Si une sous-classe étend cette classe et remplace la méthode toList sans les génériques :
class Overrider extends CollectionConverter { List toList(Collection c) {...} }
Après l'introduction des génériques , la mise à jour de la méthode toList avec des types génériques remplacerait effectivement la méthode brute :
class CollectionConverter { <T> List<T> toList(Collection<T> c) {...} }
Si la sous-classe était ensuite modifiée pour inclure les deux une méthode toList brute et générique :
class Overrider extends CollectionConverter { @Override List toList(Collection c) {...} @Override <T> List<T> toList(Collection<T> c) {...} }
Les deux méthodes remplaceraient techniquement la méthode toList générique, créant une ambiguïté que le compilateur ne peut pas résoudre.
Pour éviter cette confusion, Java ne permet pas les classes doivent avoir plusieurs méthodes avec le même effacement, obligeant ainsi les programmeurs à examiner attentivement leurs conceptions et à utiliser des types génériques le cas échéant.
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!