Un'interfaccia può estendere più interfacce in Java?


126

Un'interfaccia può estendere più interfacce in Java? Questo codice appare valido nel mio IDE e compila:

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

ma avevo sentito che l'ereditarietà multipla non era consentita in Java. Perché sembra esserci un'eccezione per le interfacce?


3
Quali articoli dicono che non è possibile? Si sbagliano o li hai fraintesi e parlano di lezioni piuttosto che di interfacce.

7
Questa domanda sembra fuori tema perché potrebbe essere facilmente risolta dall'auto-ricerca
JoseK,

4
@StephenC Se ha trovato articoli contraddittori, dovrebbe pubblicarli. In questo modo la gente sa di non leggere quegli articoli ...
Ma io non sono una classe Wrapper il

10
La risposta a questa domanda mi ha fatto risparmiare tempo. Sostengo che abbia valore come una domanda valida.
xdhmoore,

6
domanda utile, ho fatto questo aspettandomi che il mio IDE lanciasse alcuni avvertimenti, sono stato sorpreso di non vederne nessuno. Quindi ho inconsapevolmente inserito in google la stessa domanda dell'op che mi ha portato a questa pagina con alcune risposte / conferme
Arthur,

Risposte:


171

Si, puoi farlo. Un'interfaccia può estendere più interfacce, come mostrato qui:

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

Una singola classe può anche implementare più interfacce. Cosa succede se due interfacce hanno un metodo che definisce lo stesso nome e la stessa firma?

C'è un punto difficile:

interface A {
    void test();
}

interface B {
    void test();
}

class C implements A, B {

    @Override
    public void test() {

    }     

}

Quindi l'implementazione singola funziona per entrambi :).

Leggi il mio post completo qui:

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


@RahulBhadana Il metodo astratto dovrebbe sovrascrivere giusto?
Suresh Atta,

13
Cosa succede se si dispone dell'interfaccia A con void test()e dell'interfaccia B con boolean test()? (È questo un cugino del problema del diamante ?) __ Provato e succede la cosa ragionevole: non è permesso se il tipo di ritorno è diverso.
Daniel,

@sureshatta - quindi cosa succede? Non mi chiamare sia ??
Fattie l'

4
Una classe non consente a 2 metodi la stessa firma con un diverso tipo di ritorno. stackoverflow.com/questions/16149285/…
Ninh Pham

73

Un'interfaccia può estendere più interfacce .

Una classe può implementare più interfacce .

Tuttavia, una classe può estendere solo una singola classe .

Attento a come usi le parole extendse implementsquando parli di interfacee class.


8

Un'interfaccia può estendere più interfacce in Java?

La risposta è:

Secondo JLS

Un'interfaccia può essere dichiarata come estensione diretta di una o più altre interfacce, il che significa che specifica implicitamente tutti i tipi di membro, i metodi astratti e le costanti delle interfacce che estende, ad eccezione di qualsiasi tipo di membro e costanti che può nascondere.


JLS = "Java Language Specification" che è la fonte autorevole in queste domande.
Hontvári Levente,

6

Dalla pagina della documentazione Oracle sul tipo di ereditarietà multipla, possiamo trovare la risposta accurata qui . Qui dovremmo prima conoscere il tipo di eredità multipla in java: -

  1. Eredità multipla di stato.
  2. Eredità multipla di implementazione.
  3. Eredità multipla di tipo.

Java "non supporta l'ereditarietà multipla di stato, ma supporta l'ereditarietà multipla dell'implementazione con metodi predefiniti dalla versione java 8 e l'ereditarietà multipla di tipo con interfacce.

Quindi qui si pone la questione del "problema dei diamanti" e di come Java affronti questo problema:

  1. In caso di ereditarietà multipla dell'implementazione, il compilatore java genera un errore di compilazione e chiede all'utente di correggerlo specificando il nome dell'interfaccia. Esempio qui: -

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

Quindi qui avremo un errore come: - l'interfaccia D eredita valori predefiniti non correlati per method () dai tipi B e C l'interfaccia D estende B, C

Puoi sistemarlo come: -

interface D extends B, C {
                @Override
                default void method() {
                    B.super.method();
                }
            }
  1. In eredità multipla di tipo java lo consente perché l'interfaccia non contiene campi mutabili e solo una implementazione apparterrà alla classe, quindi java non dà alcun problema e ti consente di farlo.

In conclusione possiamo dire che java non supporta l'ereditarietà multipla di stato ma supporta l'ereditarietà multipla dell'implementazione e l'ereditarietà multipla di tipo .


1
Penso che questa sia una risposta più adatta e chiarisca di più alla domanda. +1
Ketan Joshi,

Grazie @KetanJoshi questo motiva molto per andare avanti :)
Shankar upadhyay

4

È possibile estendere più Interfacesma non è possibile estendere più classes.

Il motivo per cui in Java non è possibile estendere più classi, è la brutta esperienza di C ++ in cui ciò è possibile.

L'alternativa per l'ereditarietà multipe è che una classe può implementare più interfacce (o un'interfaccia può estendere più interfacce)


2

Penso che la tua confusione risieda nell'eredità multipla, in cui è una cattiva pratica farlo e anche in Java questo non è possibile. Tuttavia, l'implementazione di più interfacce è consentita in Java ed è anche sicura.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.