La implementación y que se extiende, la interfaz y la clase abstracta, respectivamente, con mismo nombre de método en java

dSanders:

Estoy tratando de entender cómo los métodos predeterminados de hacer frente a un problema de diamantes en varios escenarios.
Y, este es uno de los escenarios, que no soy capaz de entender.

A continuación se presenta la descripción,
1. Interfaz con un método predeterminado () método
2. clase abstracta con un método de método ()
3. Hormigón clase que implementa la interfaz de arriba y se extiende la clase abstracta.

interface Interface {
    default void method() {
        System.out.println("Interface method");
    }
}


abstract class AbstractClass {
    void method() {
            System.out.println("Abstract class method");
    }
}


// Concrete class definition first starts
public class ConcreteClass extends AbstractClass implements Interface {

    @Override
    public void method() {
        super.method();
    }

    public static void main(String[] args) {
        Interface test = new ConcreteClass();
        test.method();
    }
}
// Concrete class definition first ends

// Concrete class definition Second starts
public class ConcreteClass extends AbstractClass implements Interface {

    public static void main(String[] args) {
        Interface test = new ConcreteClass();
        test.method();
    }
}
// Concrete class definition Second ends

Mis consultas,

1. ¿Por qué la primera definición siempre da salida como "método de la clase abstracta" , incluso cuando se utiliza la interfaz de tipo para objeto de clase concreta?
2. ¿Por qué definición segundos no compila?
Si está utilizando el compilador implementación de la clase abstracta en la definición primera, entonces debería ser capaz de identificar que siempre va a utilizar la aplicación Resumen clase en la segunda definición.

Este comportamiento es muy confuso para mí y cualquier ayuda es muy apreciada. De lo contrario, cuanto más profundizar en esto, más confuso se pone.


Editar 1:
Error de compilación en la segunda definición es "El método heredado AbstractClass.method () no puede ocultar el método abstracto pública en la interfaz"

Miguel :

métodos predeterminados son sólo eso: los valores predeterminados. Si hay una aplicación, se va a utilizar. Si no lo hay, se utilizará el valor predeterminado. No hay ningún problema de diamantes aquí (no puede haber con múltiples valores predeterminados, sin embargo).

1) Asignación dinámica

2) La clase abstracta proporciona el método denominado methodacceso de paquete y el privado; la interfaz exige que sea pública.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=333935&siteId=1
Recomendado
Clasificación