¿Puede una interfaz extender múltiples interfaces en Java?


127

¿Puede una interfaz extender múltiples interfaces en Java? Este código parece válido en mi IDE y compila:

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

pero había escuchado que la herencia múltiple no estaba permitida en Java. ¿Por qué parece haber una excepción para las interfaces?


3
¿Qué artículos dicen que no es posible? Están equivocados o los malinterpretaste y están hablando de clases en lugar de interfaces.

77
Esta pregunta parece estar fuera de tema porque podría ser respondida fácilmente por investigación propia
JoseK

44
@StephenC Si encontraba artículos contradictorios, debería publicarlos. De esa manera la gente sabe que no debe leer esos artículos ...
Pero no soy una clase de envoltura

10
La respuesta a esta pregunta me ahorró tiempo. Sostengo que tiene valor como una pregunta válida.
xdhmoore

66
pregunta útil, hice esto esperando que mi IDE arrojara algunas advertencias, me sorprendió no ver ninguna. Entonces, sin saberlo, escribí en Google la misma pregunta que las operaciones que me llevaron a esta página con algunas respuestas / confirmación
Arthur

Respuestas:


171

Si, puedes hacerlo. Una interfaz puede extender múltiples interfaces, como se muestra aquí:

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

Una sola clase también puede implementar múltiples interfaces. ¿Qué sucede si dos interfaces tienen un método que define el mismo nombre y firma?

Hay un punto complicado:

interface A {
    void test();
}

interface B {
    void test();
}

class C implements A, B {

    @Override
    public void test() {

    }     

}

Entonces la implementación única funciona para ambos :).

Lee mi publicación completa aquí:

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


@RahulBhadana El método abstracto debería anular ¿verdad?
Suresh Atta

13
¿Qué sucede si tiene la interfaz A con void test()y la interfaz B con boolean test()? (¿Es un primo del problema del diamante ?) __ Lo probé y sucede lo sensato: no está permitido si el tipo de devolución es diferente.
Daniel

@sureshatta: ¿y qué pasa? ¿ llama a ambos ?
Fattie

44
Una clase no permite 2 métodos con la misma firma con un tipo de retorno diferente. stackoverflow.com/questions/16149285/…
Ninh Pham

74

Una interfaz puede extender múltiples interfaces .

Una clase puede implementar múltiples interfaces .

Sin embargo, una clase solo puede extender una sola clase .

Tenga cuidado de cómo usa las palabras extendsy implementscuando habla de interfacey class.


8

¿Puede una interfaz extender múltiples interfaces en java?

La respuesta es sí.

De acuerdo con JLS

Se puede declarar que una interfaz es una extensión directa de una o más interfaces, lo que significa que especifica implícitamente todos los tipos de miembros, métodos abstractos y constantes de las interfaces que extiende, excepto los tipos de miembros y constantes que pueda ocultar.


JLS = "Especificación del lenguaje Java", que es la fuente autorizada en estas preguntas.
Hontvári Levente

6

Desde la página de documentación de Oracle sobre el tipo de herencia múltiple, podemos encontrar la respuesta precisa aquí . Aquí deberíamos conocer primero el tipo de herencia múltiple en Java:

  1. Herencia múltiple del estado.
  2. Herencia múltiple de implementación.
  3. Herencia múltiple de tipo.

Java "no admite la herencia múltiple de estado, pero admite la herencia múltiple de implementación con métodos predeterminados desde el lanzamiento de Java 8 y la herencia múltiple de tipo con interfaces.

Entonces aquí surge la pregunta para el "problema del diamante" y cómo Java lidia con eso:

  1. En caso de herencia múltiple de implementación, el compilador de Java da un error de compilación y le pide al usuario que lo arregle especificando el nombre de la interfaz. Ejemplo aquí: -

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

Así que aquí obtendremos un error como: - la interfaz D hereda los valores predeterminados no relacionados para el método () de los tipos B y C, la interfaz D se extiende B, C

Puedes arreglarlo como: -

interface D extends B, C {
                @Override
                default void method() {
                    B.super.method();
                }
            }
  1. En la herencia múltiple de tipo java lo permite porque la interfaz no contiene campos mutables y solo una implementación pertenecerá a la clase, por lo que java no da ningún problema y le permite hacerlo.

En conclusión, podemos decir que Java no admite la herencia múltiple de estado, pero sí admite la herencia múltiple de implementación y la herencia múltiple de tipo .


1
Creo que esta es una respuesta más adecuada y aclara más la pregunta. +1
Ketan Joshi

Gracias @KetanJoshi esto motiva mucho para continuar :)
shankar upadhyay

4

Puede extender múltiples Interfacespero no puede extender múltiples classes.

La razón por la que no es posible en Java extender múltiples clases, es la mala experiencia de C ++ donde esto es posible.

La alternativa para la herencia multipe es que una clase puede implementar múltiples interfaces (o una interfaz puede extender múltiples interfaces)


2

Creo que su confusión radica en la herencia múltiple, en la que es una mala práctica hacerlo y en Java esto tampoco es posible. Sin embargo, la implementación de múltiples interfaces está permitida en Java y también es segura.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.