¿Por qué Java 8 compilación falla cuando Programado Método es anulado por el Método estático de la subclase?

Cristiano pasos:

Aplicación Java 8, por qué el código de abajo falla al compilar?

interface Father {
    static void method() { }
}

interface Mother {
    default void method() { }
}

interface Child extends Father, Mother {
    static void method() { }
}

Según mi entendimiento, cada método estático pertenece a su clase específica, por lo tanto, por qué cuando la interfaz Niño define static void method() { }el compilador da el siguiente error?

() método en el niño choca con el método () en reemplazo de métodos Madre es estático

Niño no debe mantener a la implementación del método por defecto desde la madre al tiempo que permite el padre y el niño con sus propios métodos estáticos como: Father.method () y Child.method ()?

Pshemo:

Fatherno es un problema aquí, ya se métodos estáticos de las interfaces no heredados (por ejemplo, List.of(..)no puede ser invocado a través de ArrayList.of(..)) lo que no hay imperiosas / ocultación que también significa que no hay colisiones.

Debido a que se puede escribir de forma segura

interface Father {
    static void method() { } 
}
interface Child extends Father {
    static void method() { } 
}

Problema es default void method() { }método de Motherinterfaz que se hereda a Childque significa que después

interface Child extends Father, Mother { 
    static void method() { } 
}

que terminaría con la interfaz de la que tendría dos method()versiones: estáticos y no estáticos (por defecto)

interface Child extends Father, Mother { 
    static void method() { } 
    default void method() { } //inherited from Mother
}

Pero ¿por qué es un problema?

Imagine que quiere añadir otro método para Childla interfaz que se llamemethod()

interface Child extends Father, Mother { 
    static void method() { } 
    default void method() { } //inherited from Mother
    default void demo(){
        method(); //which code block should be executed?
    }
}

En caso de que ejecutar código desde estática método () o de forma predeterminada método ()? Compilador no sería capaz de decidir.

A pesar de que esta situación podría resolverse mediante el uso de

  • Child.method() para el método estático,
  • this.method()para el método por defecto (sí, es wound't ser ambigua porque el método estático no sería heredado por clase de la que thissería ejemplo),

se trata es de evitar este tipo de problemas en el primer lugar. Es por eso que estamos obligados a no tener estática y métodos no estáticos con la misma firma (nombre + parameterTypes) en un solo lugar (definido o heredado).

Supongo que te gusta

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