Kann eine Schnittstelle mehrere Schnittstellen in Java erweitern?

126

Kann eine Schnittstelle mehrere Schnittstellen in Java erweitern? Dieser Code scheint in meiner IDE gültig zu sein und wird kompiliert:

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

aber ich hatte gehört, dass Mehrfachvererbung in Java nicht erlaubt war. Warum scheint es eine Ausnahme für Schnittstellen zu geben?

Prateek
quelle
3
Welche Artikel sagen, dass es nicht möglich ist? Sie sind entweder falsch oder Sie haben sie falsch verstanden und sie sprechen eher von Klassen als von Schnittstellen.
7
Diese Frage scheint nicht zum Thema zu gehören, da sie leicht durch Selbstforschung beantwortet werden kann
JoseK
4
@StephenC Wenn er widersprüchliche Artikel gefunden hat, sollte er sie posten. Auf diese Weise wissen die Leute, dass sie diese Artikel nicht lesen sollen ...
Aber ich bin keine Wrapper-Klasse
10
Die Antwort auf diese Frage hat mir Zeit gespart. Ich behaupte, dass es als gültige Frage einen Wert hat.
xdhmoore
6
hilfreiche Frage, ich habe dies getan und erwartet, dass meine IDE einige Warnungen auslöst, war erstaunt, keine zu sehen. Also habe ich unwissentlich in Google die gleiche Frage wie die OP eingegeben, die mich zu dieser Seite mit einigen Antworten / Bestätigungen geführt hat
Arthur

Antworten:

170

Ja, du kannst es schaffen. Eine Schnittstelle kann mehrere Schnittstellen erweitern, wie hier gezeigt:

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

Eine einzelne Klasse kann auch mehrere Schnittstellen implementieren. Was ist, wenn zwei Schnittstellen eine Methode haben, die denselben Namen und dieselbe Signatur definiert?

Es gibt einen schwierigen Punkt:

interface A {
    void test();
}

interface B {
    void test();
}

class C implements A, B {

    @Override
    public void test() {

    }     

}

Dann funktioniert eine einzelne Implementierung für beide :).

Lesen Sie hier meinen vollständigen Beitrag:

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

Suresh Atta
quelle
@ RahulBhadana Abstrakte Methode sollte richtig überschreiben?
Suresh Atta
13
Was ist, wenn Sie Schnittstelle A mit void test()und Schnittstelle B mit haben boolean test()? (Ist dies ein Cousin des Diamantenproblems ?) __Versucht und das Vernünftige passiert: Nicht erlaubt, wenn der Rückgabetyp unterschiedlich ist.
Daniel
@sureshatta - also was passiert? nennt es beides ?
Fattie
4
Eine Klasse erlaubt nicht zwei Methoden derselben Signatur mit unterschiedlichem Rückgabetyp. stackoverflow.com/questions/16149285/…
Ninh Pham
73

Eine Schnittstelle kann mehrere Schnittstellen erweitern .

Eine Klasse kann mehrere Schnittstellen implementieren .

Eine Klasse kann jedoch nur eine einzelne Klasse erweitern .

Seien Sie vorsichtig, wie Sie die Wörter verwenden extendsund implementswenn Sie über interfaceund sprechen class.

Aber ich bin keine Wrapper-Klasse
quelle
8

Kann eine Schnittstelle mehrere Schnittstellen in Java erweitern?

Die Antwort lautet: Ja.

Laut JLS

Eine Schnittstelle kann als direkte Erweiterung einer oder mehrerer anderer Schnittstellen deklariert werden. Dies bedeutet, dass implizit alle Elementtypen, abstrakten Methoden und Konstanten der von ihr erweiterten Schnittstellen angegeben werden, mit Ausnahme aller Elementtypen und Konstanten, die möglicherweise ausgeblendet werden.

Masudul
quelle
JLS = "Java Language Specification", die maßgebliche Quelle für diese Fragen.
Hontvári Levente
6

Von der Oracle - Dokumentation Seite über Mehrfachvererbung Typ, können wir die genaue Antwort finden hier . Hier sollten wir zuerst die Art der Mehrfachvererbung in Java kennen: -

  1. Mehrfache Vererbung des Staates.
  2. Mehrfachvererbung der Implementierung.
  3. Mehrfachvererbung des Typs.

Java "unterstützt nicht die Mehrfachvererbung des Status, aber die Mehrfachvererbung der Implementierung mit Standardmethoden seit der Veröffentlichung von Java 8 und die Mehrfachvererbung des Typs mit Schnittstellen.

Dann stellt sich hier die Frage nach dem "Diamantproblem" und wie Java damit umgeht:

  1. Bei mehrfacher Vererbung der Implementierung gibt der Java-Compiler einen Kompilierungsfehler aus und fordert den Benutzer auf, ihn durch Angabe des Schnittstellennamens zu beheben. Beispiel hier: -

                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 {
    
                }

Hier erhalten wir also folgende Fehlermeldung: - Schnittstelle D erbt nicht verwandte Standardeinstellungen für Methode () von Typ B und C Schnittstelle D erweitert B, C.

Sie können es wie folgt beheben: -

interface D extends B, C {
                @Override
                default void method() {
                    B.super.method();
                }
            }
  1. Bei der Mehrfachvererbung vom Typ Java ist dies möglich, da die Schnittstelle keine veränderlichen Felder enthält und nur eine Implementierung zur Klasse gehört, sodass Java keine Probleme verursacht und Sie dies tun können.

Zusammenfassend können wir sagen, dass Java keine Mehrfachvererbung des Status unterstützt , aber eine Mehrfachvererbung der Implementierung und eine Mehrfachvererbung des Typs .

Shankar Upadhyay
quelle
1
Ich denke, dies ist eine passendere Antwort und klärt mehr auf die Frage. +1
Ketan Joshi
Vielen Dank @KetanJoshi dies motiviert viel, weiterzumachen :)
Shankar Upadhyay
4

Sie können mehrere erweitern, Interfacesaber Sie können nicht mehrere erweitern classes.

Der Grund, warum es in Java nicht möglich ist, mehrere Klassen zu erweitern, ist die schlechte Erfahrung aus C ++, wo dies möglich ist.

Die Alternative für die Multipe-Vererbung besteht darin, dass eine Klasse mehrere Schnittstellen implementieren kann (oder eine Schnittstelle mehrere Schnittstellen erweitern kann).

AlexWien
quelle
2

Ich denke, Ihre Verwirrung liegt in der Mehrfachvererbung, in der es eine schlechte Praxis ist, dies zu tun, und in Java ist dies auch nicht möglich. Die Implementierung mehrerer Schnittstellen ist jedoch in Java zulässig und auch sicher.

Cem Sultan
quelle
2

Eine Java-Klasse kann nur eine übergeordnete Klasse erweitern. Mehrfachvererbung ist nicht zulässig. Schnittstellen sind jedoch keine Klassen, und eine Schnittstelle kann mehr als eine übergeordnete Schnittstelle erweitern.

Schauen Sie sich zum Beispiel hier an: http://www.tutorialspoint.com/java/java_interfaces.htm

mmdc
quelle