Maison > Java > javaDidacticiel > Comment Java empêche-t-il les conflits de surcharge causés par l'effacement de méthode ?

Comment Java empêche-t-il les conflits de surcharge causés par l'effacement de méthode ?

DDD
Libérer: 2024-12-17 11:35:24
original
526 Les gens l'ont consulté

How Does Java Prevent Overload Conflicts Caused by Method Erasure?

É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) {}
}
Copier après la connexion

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) {}
Copier après la connexion

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) {...}
}
Copier après la connexion

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) {...}
}
Copier après la connexion

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) {...}
}
Copier après la connexion

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) {...}
}
Copier après la connexion

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!

source:php.cn
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal