Les interfaces héritent-elles de Object
en Java ?
Non, ils ne le font pas. Et il n'y a pas non plus d'interface "racine" commune héritée implicitement par toutes les interfaces (comme dans le cas des classes). (*)
Si non, comment pouvons-nous appeler la méthode de la classe objet sur l'instance de l'interface ?
Une interface déclare implicitement une méthode pour chaque méthode publique de l'interface. Object
. Ainsi, le equals
est implicitement déclarée comme membre dans une interface (à moins qu'elle n'en hérite déjà d'une superinterface).
Ceci est expliqué en détail dans la spécification du langage Java, § 9.2 Membres de l'interface .
9.2 Membres de l'interface
[...]
- Si une interface n'a pas de super-interfaces directes, alors l'interface déclare implicitement une méthode membre abstraite publique m avec signature s , type de retour r et lance la clause t correspondant à chaque méthode d'instance publique m avec la signature s , type de retour r et lance la clause t déclaré dans
Object
sauf si une méthode ayant la même signature, le même type de retour et une clause throws compatible est explicitement déclarée par l'interface.
[...]
Ce message a été réécrit sous forme d'article. aquí .
(*) Notez que la notion d'être un sous-type de n'est pas équivalent à hérite de : Les interfaces sans super interface sont en effet des sous-types de Object
( § 4.10.2. Sous-typage entre les types de classe et d'interface ) même s'ils n'héritent pas de Object
.
0 votes
@EJP, techniquement parlant, ce que contient java/io/Serializable.class n'a aucune importance. Je pense que vous confondez la Java Lang Spec avec la JVM spec.
0 votes
@aioobe Comme je n'ai mentionné aucune de ces spécifications, je ne comprends pas votre point de vue.
Serializable
est une interface, la plus simple possible ; l'exécution dejavap
Il vous indique de quoi il hérite, et cela est dicté par la spécification du langage Java. Si vous pensez que la spécification de la JVM entre en jeu quelque part, éclairez-nous.2 votes
@EJP, la question porte sur le langage Java (c'est-à-dire la spécification du langage Java). Ce que contient java/io/Serializable.class est lié à ce que dit la spécification de la JVM. Techniquement parlant, il n'y a aucune garantie qu'il y ait une correspondance biunivoque entre les caractéristiques des deux spécifications.
0 votes
J'ai développé ce point dans un récent article de blog .