Maison > Java > javaDidacticiel > Comment Java gère-t-il plusieurs interfaces avec des signatures de méthode identiques ?

Comment Java gère-t-il plusieurs interfaces avec des signatures de méthode identiques ?

Linda Hamilton
Libérer: 2024-12-03 03:15:14
original
345 Les gens l'ont consulté

How Does Java Handle Multiple Interfaces with Identical Method Signatures?

Implémentation de plusieurs interfaces avec les mêmes signatures de méthode

En Java, lorsqu'une classe implémente plusieurs interfaces qui définissent des méthodes portant le même nom et signature, la question se pose : quelle méthode est remplacé ?

Selon la spécification du langage Java (JLS), le compilateur déterminera la méthode à remplacer en fonction de la règle suivante :

< p>Les méthodes héritées de plusieurs interfaces sont considérées comme « équivalentes à un remplacement » (JLS 8.4.8.4) si elles ont la même signature. Par conséquent, une seule implémentation de méthode est nécessaire.

Exemple :

test de classe publique implémente A, B { <br> public static void main(String... args) lance une exception{ </p>
<p>}</p>
<p>@Override<br> public int f() { // depuis quelle interface A ou B</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">return 0;
Copier après la connexion

}
}
< ;/pre>

Dans ce code, la classe Test implémente les interfaces A et B, qui ont toutes deux une méthode nommée f() avec le même signature. Étant donné que ces méthodes sont équivalentes au remplacement, peu importe la méthode f() de l'interface qui est remplacée par Test.f(). Une seule implémentation est requise et le compilateur ne fera pas de distinction entre les deux interfaces.

Ce comportement s'étend à l'héritage et au masquage de méthodes. Si une méthode d'interface entre en conflit avec une méthode de la superclasse ou d'une autre interface, les méthodes en conflit doivent être équivalentes à un remplacement pour que le code soit valide.

Exemple de compatibilité :

<br>interface publique Cadeau {cadeau vide (); ><br>interface publique Invité { void present(); ></p>
<p>classe publique Présentable implémente Cadeau, Invité { <br> @Override <br> public void present() {</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">System.out.println("Heeeereee's Johnny!!!");
Copier après la connexion

}
}

Ici, Gift et Guest ont tous deux une méthode present(). La classe Presentable implémente les deux interfaces et fournit une seule implémentation pour present(). Le compilateur reconnaît que ces méthodes sont équivalentes au remplacement et ne nécessitent pas d'implémentations distinctes.

Exemple d'incompatibilité :

interface publique Cadeau { void present(); ><br>interface publique Invité { boolean present(); ></p><p>classe publique Présentable implémente Cadeau, Invité { // NE COMPILE PAS !!!<br> // Erreur : les types Cadeau et Invité sont incompatibles<br>}<br>

Dans ce cas, les types de retour des méthodes present() sont différents. Selon JLS 8.4.8.3, les méthodes de remplacement doivent avoir des signatures et des types de retour compatibles. Étant donné que Gift.present() et Guest.present() n'ont pas de types de retour compatibles, le code ne se compile pas.

En résumé, lors de l'implémentation de plusieurs interfaces avec les mêmes signatures de méthode, le compilateur identifiez la méthode à remplacer comme étant celle qui est équivalente au remplacement. Cela signifie qu'une seule implémentation de méthode est requise, quelle que soit l'interface qui définit la méthode.

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
Article précédent:Quel rôle joue l'annuaire WEB-INF dans la sécurisation d'une application Web Java EE ? Article suivant:Résultat INPUT de Struts 2 : comment les erreurs de conversion et de validation sont-elles gérées, et pourquoi un résultat INPUT est-il renvoyé au lieu d'une exception ?
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
Derniers numéros
Rubriques connexes
Plus>
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal