166 votes

Les interfaces héritent-elles de la classe Object en java ?

Les interfaces héritent-elles de Object en Java ?

Si non, comment pouvons-nous appeler la méthode de la classe objet sur l'instance de l'interface ?

public class Test {
    public static void main(String[] args) {
        Employee e = null;
        e.equals(null);
    }
}

interface Employee {
}

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 de javap 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.

166voto

aioobe Points 158466

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

Cela explique-t-il le comportement de boolean isObject = myList instanceof Object être vrai ? Ou est-ce parce que instanceof s'intéresse à ce qu'est réellement l'objet, et non à la référence que vous y faites.

0 votes

instanceof effectue la vérification par rapport au type d'exécution (sinon, toute l'expression d'instance pourrait être évaluée au moment de la compilation).

1 votes

@aioobe Si nous implémentons une interface, alors pourquoi ne pas donner l'implémentation de la méthode "equals" dans la classe qui implémente cette interface. Selon mes concepts, nous devons implémenter les méthodes de l'interface dans la classe d'implémentation, sinon la classe sera abstraite.

15voto

irreputable Points 25577

Object est un supertype de toute interface [1].

Cependant, une interface n'est pas implements , extends ou, "hériter de" Object .

JLS a une clause spéciale à ajouter Object méthodes en interfaces [2]

[1] http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.10.2

[2] http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.2

0 votes

C'est la réponse la plus précise. Elle devrait être acceptée. Par exemple, une méthode qui prend un java.lang.Object acceptera également une référence de tout type d'interface. De plus, vous pouvez convertir une interface en un Object implicitement sans aucune erreur de compilation.

12voto

finnw Points 24592

Il y a en fait un champ de superclasse dans chaque .class y compris ceux qui représentent des interfaces.

Pour une interface, il pointe toujours vers java.lang.Object . Mais cela ne sert à rien.

Une autre façon de voir les choses est :

interface MyInterface {
    // ...
}

public myMethod(MyInterface param) {
    Object obj = (Object) param;
    // ...
}

Voici le casting (Object) param est toujours valide, ce qui implique que chaque type d'interface est un sous-type de java.lang.Object .

5 votes

Le fichier .class est un artefact du fichier .java. Expliquer pourquoi quelque chose fonctionne en langage Java en regardant le fichier .class résultant est un raisonnement à rebours.

0 votes

Object obj = (Object) param ; ne lève pas d'erreur de compilation. Mais les méthodes (publiques) de MyInterface ne sont pas visibles par obj. On ne peut donc pas supposer que MonInterface est un sous-type de java.lang.Object pour chaque type d'interface.

7voto

kostja Points 20153

-- EDIT :

Cette réponse est incorrect . Veuillez consulter les commentaires de @aioobe ci-dessous et sa réponse ci-dessus.

--

Chaque Class implémentant l'interface dérive de Object . C'est la raison pour laquelle vous pouvez appeler Object sur chaque implémenteur.

L'interface elle-même ne l'est pas, puisqu'il ne s'agit pas d'une Object

0voto

dalvarezmartinez1 Points 249

" Les types de référence héritent tous de java.lang.Object. . Classes, enums, tableaux et Les interfaces sont toutes des types de référence. "

Cité par : http://docs.oracle.com/javase/tutorial/reflect/class/index.html Deuxième phrase pour être clair.

0 votes

Classes, enums, and arrays (which all inherit from java.lang.Object) as well as interfaces are all reference types Il ne dit pas que l'interface hérite de l'objet. Seulement Classes, enums et arrays.

0 votes

Ils l'ont changé :)

0 votes

Même si "ils l'ont changé" (ce dont je doute), le tutoriel peut être erroné. La référence normative est la spécification du langage Java (JLS).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X