Une interface peut-elle étendre plusieurs interfaces en Java?

127

Une interface peut-elle étendre plusieurs interfaces en Java? Ce code apparaît valide dans mon IDE et il compile:

interface Foo extends Runnable, Set, Comparator<String> { }

mais j'avais entendu dire que l'héritage multiple n'était pas autorisé à Java. Pourquoi semble-t-il y avoir une exception pour les interfaces?

Prateek
la source
3
Quels articles disent que ce n'est pas possible? Soit ils ont tort, soit vous les avez mal compris et ils parlent de classes plutôt que d'interfaces.
7
Cette question semble être hors sujet car elle pourrait facilement être répondue par l'auto-recherche
JoseK
4
@StephenC S'il trouve des articles contradictoires, il devrait les publier. De cette façon, les gens savent ne pas lire ces articles ...
Mais je ne suis pas une classe de wrapper
10
La réponse à cette question m'a fait gagner du temps. Je soutiens que cela a de la valeur en tant que question valable.
xdhmoore
6
question utile, je l'ai fait en m'attendant à ce que mon IDE lance des avertissements, j'ai été étonné de n'en voir aucun. J'ai donc tapé sans le savoir dans google la même question que les op qui m'ont conduit à cette page avec quelques réponses / confirmation
Arthur

Réponses:

171

Oui tu peux le faire. Une interface peut étendre plusieurs interfaces, comme indiqué ici:

interface Maininterface extends inter1, inter2, inter3 {  
  // methods
}

Une seule classe peut également implémenter plusieurs interfaces. Et si deux interfaces ont une méthode définissant le même nom et la même signature?

Il y a un point délicat:

interface A {
    void test();
}

interface B {
    void test();
}

class C implements A, B {

    @Override
    public void test() {

    }     

}

Ensuite, une seule implémentation fonctionne pour les deux :).

Lisez mon article complet ici:

http://codeinventions.blogspot.com/2014/07/can-interface-extend-multiple.html

Suresh Atta
la source
@RahulBhadana La méthode abstraite devrait remplacer, non?
Suresh Atta
13
Et si vous avez l'interface A avec void test()et l'interface B avec boolean test()? (Est-ce un cousin du problème du diamant ?) __Essayé et la chose sensée se produit: non autorisé si le type de retour est différent.
Daniel
@sureshatta - alors que se passe-t-il? appelle- t-il les deux ??
Fattie
4
Une classe n'autorise pas 2 méthodes de même signature avec un type de retour différent. stackoverflow.com/questions/16149285/…
Ninh Pham
74

Une interface peut étendre plusieurs interfaces .

Une classe peut implémenter plusieurs interfaces .

Cependant, une classe ne peut étendre qu'une seule classe .

Faites attention à la manière dont vous utilisez les mots extendset implementslorsque vous parlez de interfaceet class.

Mais je ne suis pas une classe wrapper
la source
8

Une interface peut-elle étendre plusieurs interfaces en java?

La réponse est: Oui.

Selon JLS

Une interface peut être déclarée être une extension directe d'une ou plusieurs autres interfaces, ce qui signifie qu'elle spécifie implicitement tous les types de membres, méthodes abstraites et constantes des interfaces qu'elle étend, à l'exception des types de membres et des constantes qu'elle peut masquer.

Masudul
la source
JLS = "Java Language Specification" qui est la source faisant autorité dans ces questions.
Hontvári Levente
6

À partir de la page de documentation Oracle sur les types d'héritage multiple, nous pouvons trouver la réponse exacte ici . Ici, nous devons d'abord connaître le type d'héritage multiple en java: -

  1. Héritage multiple d'état.
  2. Héritage multiple d'implémentation.
  3. Héritage multiple de type.

Java "ne prend pas en charge l'héritage multiple d'état, mais il prend en charge l'héritage multiple d'implémentation avec les méthodes par défaut depuis la version java 8 et l'héritage multiple de type avec les interfaces.

Ensuite, la question se pose pour le "problème de diamant" et comment Java gère cela: -

  1. En cas d'héritage multiple de l'implémentation, le compilateur java donne une erreur de compilation et demande à l'utilisateur de la corriger en spécifiant le nom de l'interface. Exemple ici: -

                interface A {
                    void method();
                }
    
                interface B extends A {
                    @Override
                    default void method() {
                        System.out.println("B");
                    }
                }
    
                interface C extends A { 
                    @Override
                    default void method() {
                        System.out.println("C");
                    }
                }
    
                interface D extends B, C {
    
                }

Donc, ici, nous obtiendrons l'erreur comme: - l'interface D hérite des valeurs par défaut non liées pour la méthode () des types B et C l'interface D étend B, C

Vous pouvez le réparer comme: -

interface D extends B, C {
                @Override
                default void method() {
                    B.super.method();
                }
            }
  1. Dans l'héritage multiple de type java le permet parce que l'interface ne contient pas de champs mutables et qu'une seule implémentation appartiendra à la classe donc java ne pose aucun problème et vous permet de le faire.

En conclusion, nous pouvons dire que java ne prend pas en charge l' héritage multiple d'état, mais qu'il prend en charge l' héritage multiple d'implémentation et l'héritage multiple de type .

Shankar upadhyay
la source
1
Je pense que c'est une réponse plus appropriée et clarifie davantage la question. +1
Ketan Joshi
Merci @KetanJoshi, cela motive beaucoup à continuer :)
shankar upadhyay
4

Vous pouvez étendre plusieurs Interfacesmais vous ne pouvez pas étendre plusieurs classes.

La raison pour laquelle il n'est pas possible en Java d'étendre plusieurs classes est la mauvaise expérience de C ++ où cela est possible.

L'alternative pour l'héritage multipipe est qu'une classe peut implémenter plusieurs interfaces (ou une interface peut étendre plusieurs interfaces)

AlexWien
la source
2

Je pense que votre confusion réside dans l'héritage multiple, dans lequel c'est une mauvaise pratique de le faire et en Java, ce n'est pas non plus possible. Cependant, l'implémentation de plusieurs interfaces est autorisée en Java et est également sûre.

Cem Sultan
la source
2

Une classe Java ne peut étendre qu'une seule classe parente. L'héritage multiple n'est pas autorisé. Cependant, les interfaces ne sont pas des classes et une interface peut étendre plusieurs interfaces parentes.

par exemple, jetez un œil ici: http://www.tutorialspoint.com/java/java_interfaces.htm

mmdc
la source