java - method - Llamar al método por defecto en la interfaz cuando hay un conflicto con un método privado
public default java (1)
Actualización: Parece que es realmente un bug .
¡Una declaración de método de clase o superclase siempre tiene prioridad sobre un método predeterminado!
default hello(...)
método de default hello(...)
de Myinterface
permite escribir sin errores:
ClassB b = new ClassB();
b.hello();
Hasta el tiempo de ejecución, porque en el tiempo de ejecución el método hello(...)
de ClassA
toma la prioridad más alta (pero el método es privado). Por lo tanto, se produce IllegalAccessError
.
Si elimina el método predeterminado de hello(...)
de la interfaz, obtendrá el mismo error de acceso ilegal, pero ahora en tiempo de compilación.
Considere debajo de la jerarquía de clases.
class ClassA {
private void hello() {
System.out.println("Hello from A");
}
}
interface Myinterface {
default void hello() {
System.out.println("Hello from Interface");
}
}
class ClassB extends ClassA implements Myinterface {
}
public class Test {
public static void main(String[] args) {
ClassB b = new ClassB();
b.hello();
}
}
Ejecutar el programa dará el siguiente error:
Exception in thread "main" java.lang.IllegalAccessError: tried to access method com.testing.ClassA.hello()V from class com.testing.Test
at com.testing.Test.main(Test.java:23)
- Esto es todo porque marqué ClassA.hello como privado.
- Si marca ClassA.hello como protegido o elimino el modificador de visibilidad (es decir, lo hace el alcance predeterminado), se muestra un error de compilación como:
The inherited method ClassA.hello() cannot hide the public abstract method in Myinterface
Sin embargo, según la excepción stacktrace anterior, obtengo un IllegalAccessError en tiempo de ejecución.
No pude entender por qué esto no se detecta en el momento de la compilación. Alguna pista ?