Java 8 presenta métodos predeterminados para proporcionar la capacidad de extender interfaces sin la necesidad de modificar las implementaciones existentes.
Me pregunto si es posible invocar explícitamente la implementación predeterminada de un método cuando ese método se ha anulado o no está disponible debido a implementaciones predeterminadas conflictivas en diferentes interfaces.
interface A {
default void foo() {
System.out.println("A.foo");
}
}
class B implements A {
@Override
public void foo() {
System.out.println("B.foo");
}
public void afoo() {
// how to invoke A.foo() here?
}
}
Considerando el código anterior, ¿cómo llamarías A.foo()
desde un método de clase B?
Respuestas:
Según este artículo , accede al método predeterminado en la interfaz
A
usandoEsto podría usarse de la siguiente manera (suponiendo que las interfaces
A
yC
ambas tienen métodos predeterminadosfoo()
)A
yC
pueden tener.foo()
métodos y se puede elegir la implementación predeterminada específica o puede usar uno (o ambos) como parte de su nuevofoo()
método. También puede usar la misma sintaxis para acceder a las versiones predeterminadas en otros métodos en su clase de implementación.La descripción formal de la sintaxis de invocación del método se puede encontrar en el capítulo 15 de la JLS .
fuente
A extends SomeOtherInterface
, ySomeOtherInterface
tienedefault Type method()
, entonces no puede simplemente llamarSomeOtherInterface.super.method()
desde ChildClass. Solo puede llamar a los métodos predeterminados de las interfaces enumeradas en la cláusulaChildClass
'simplements
, no a los métodos de sus interfaces principales.super.super.someMethod();
(porque eso sería horrible)El siguiente código debería funcionar.
Salida:
fuente
Esta respuesta está escrita principalmente para usuarios que provienen de la pregunta 45047550 que está cerrada.
Las interfaces Java 8 introducen algunos aspectos de la herencia múltiple. Los métodos predeterminados tienen un cuerpo de función implementado. Para llamar a un método desde la superclase, puede usar la palabra clave
super
, pero si desea hacer esto con una súper interfaz, debe nombrarlo explícitamente.Salida:
fuente
No necesita anular el método predeterminado de una interfaz. Solo llámalo así:
Salida:
fuente