poner fondo colorear color java inheritance interface java-8 default-method

fondo - Llamar explícitamente a un método predeterminado en Java



colorear un jlabel java (3)

El siguiente código debería funcionar.

public class B implements A { @Override public void foo() { System.out.println("B.foo"); } void aFoo() { A.super.foo(); } public static void main(String[] args) { B b = new B(); b.foo(); b.aFoo(); } } interface A { default void foo() { System.out.println("A.foo"); } }

Salida:

B.foo A.foo

Java 8 introduce métodos predeterminados para proporcionar la capacidad de ampliar 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 ha sido 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 A.foo() desde un método de clase B?


No es necesario que anule el método predeterminado de una interfaz. Simplemente llámalo así:

public class B implements A { @Override public void foo() { System.out.println("B.foo"); } public void afoo() { A.super.foo(); } public static void main(String[] args) { B b=new B(); b.afoo(); } }

Salida:

A.foo


Según este artículo accedes al método predeterminado en la interfaz A usando

A.super.foo();

Esto podría usarse de la siguiente manera (suponiendo que las interfaces A y C tengan los métodos predeterminados foo() )

public class ChildClass implements A, C { @Override public void foo() { //you could completely override the default implementations doSomethingElse(); //or manage conflicts between the same method foo() in both A and C A.super.foo(); } public void bah() { A.super.foo(); //original foo() from A accessed C.super.foo(); //original foo() from C accessed } }

A y C pueden tener métodos .foo() y se puede elegir la implementación predeterminada específica o puede usar uno (o ambos) como parte de su nuevo método foo() . 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 JLS .