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;
}
}
< ;/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!!!");
}
}
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!