Uma interface pode estender várias interfaces em Java?

126

Uma interface pode estender várias interfaces em Java? Este código parece válido no meu IDE e compila:

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

mas ouvi dizer que a herança múltipla não era permitida em Java. Por que parece haver uma exceção para interfaces?

Prateek
fonte
3
Quais artigos dizem que não é possível? Eles estão errados ou você os entendeu mal e estão falando de classes em vez de interfaces.
7
Esta questão parece ser off-topic, pois poderia ser facilmente respondidas por auto-pesquisa
Josek
4
@StephenC Se ele encontrou artigos contraditórios, deveria publicá-los. Dessa forma, as pessoas sabem que não devem ler esses artigos ...
Mas eu não sou uma classe de invólucros
10
A resposta a esta pergunta me economizou tempo. Argumento que tem valor como uma pergunta válida.
Xdhmoore 30/03
6
pergunta útil, eu fiz isso esperando que meu IDE lançasse alguns avisos; fiquei surpreso ao ver nenhum. Então eu inadvertidamente digitou no Google a mesma pergunta que do OP que me levaram a essa página com algumas respostas / confirmação
Arthur

Respostas:

170

Sim, você consegue. Uma interface pode estender várias interfaces, como mostrado aqui:

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

Uma única classe também pode implementar várias interfaces. E se duas interfaces tiverem um método que defina o mesmo nome e assinatura?

Há um ponto complicado:

interface A {
    void test();
}

interface B {
    void test();
}

class C implements A, B {

    @Override
    public void test() {

    }     

}

A implementação única funciona para ambos :).

Leia meu post completo aqui:

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

Suresh Atta
fonte
@RahulBhadana O método abstrato deve substituir, certo?
Suresh Atta
13
E se você tiver a interface A com void test()e a interface B com boolean test()? (Isso é um primo do problema do diamante ?) __ Tentei e o mais sensato acontece: não é permitido se o tipo de retorno for diferente.
Daniel
@sureshatta - então o que acontece? ele chamar tanto ??
Fattie
4
Uma classe não permite 2 métodos com a mesma assinatura e com diferentes tipos de retorno. stackoverflow.com/questions/16149285/…
Ninh Pham
73

Uma interface pode estender várias interfaces .

Uma classe pode implementar várias interfaces .

No entanto, uma classe só pode estender uma única classe .

Cuidado como você usa as palavras extendse implementsquando fala sobre interfacee class.

Mas eu não sou uma classe de invólucro
fonte
8

Uma interface pode estender várias interfaces em java?

A resposta é: sim.

De acordo com JLS

Uma interface pode ser declarada como uma extensão direta de uma ou mais interfaces, o que significa que especifica implicitamente todos os tipos de membros, métodos abstratos e constantes das interfaces que ela estende, exceto os tipos e constantes de membros que podem ocultar.

Masudul
fonte
JLS = "Java Language Specification", que é a fonte autorizada nessas perguntas.
Hontvári Levente
6

Na página de documentação da Oracle sobre o tipo de herança múltipla, podemos encontrar a resposta precisa aqui . Aqui devemos primeiro conhecer o tipo de herança múltipla em java: -

  1. Herança múltipla de estado.
  2. Herança múltipla de implementação.
  3. Herança múltipla do tipo.

Java "não suporta herança múltipla de estado, mas suporta herança múltipla de implementação com métodos padrão desde o lançamento do java 8 e herança múltipla de tipo com interfaces.

Então aqui surge a questão do "problema do diamante" e como o Java lida com isso:

  1. No caso de herança múltipla da implementação, o compilador java fornece erro de compilação e pede ao usuário para corrigi-lo, especificando o nome da interface. Exemplo aqui: -

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

Então, aqui teremos erro como: - a interface D herda padrões não relacionados para o método () dos tipos B e C, a interface D estende B, C

Você pode corrigi-lo como: -

interface D extends B, C {
                @Override
                default void method() {
                    B.super.method();
                }
            }
  1. Na herança múltipla do tipo, o java permite porque a interface não contém campos mutáveis ​​e apenas uma implementação pertence à classe, portanto o java não apresenta nenhum problema e permite que você o faça.

Em conclusão, podemos dizer que o java não suporta herança múltipla de estado, mas suporta herança múltipla de implementação e herança múltipla de tipo .

shankar upadhyay
fonte
1
Penso que esta é uma resposta mais adequada e esclarece mais a questão. 1
Ketan Joshi,
Obrigado @KetanJoshi Isso motiva muito para seguir em frente :)
Shankar upadhyay
4

Você pode estender vários, Interfacesmas não pode estender vários classes.

O motivo pelo qual não é possível em Java estender várias classes é a má experiência do C ++, onde isso é possível.

A alternativa para herança multiponto é que uma classe pode implementar várias interfaces (ou uma Interface pode estender várias interfaces)

AlexWien
fonte
2

Eu acho que sua confusão está na herança múltipla, na qual é uma prática ruim fazer isso e em Java isso também não é possível. No entanto, a implementação de múltiplas interfaces é permitida em Java e também é segura.

Cem Sultan
fonte
2

Uma classe Java pode estender apenas uma classe pai. Herança múltipla não é permitida. As interfaces não são classes, no entanto, e uma interface pode estender mais de uma interface pai.

por exemplo, dê uma olhada aqui: http://www.tutorialspoint.com/java/java_interfaces.htm

mmdc
fonte