interfaces implementacion herencia entre ejemplos diferencias interface static java-8

interface - implementacion - En Java 8, ¿por qué no se puede llamar al método estático de interfaz que la clase actual está implementando[duplicado]?



implementacion de interfaces en java (1)

Estoy jugando con las nuevas características de Java 8 recientemente y observé un comportamiento interesante:

Esto está bien:

Class A { static void staticMethodInA() {println();} } Class B extends A {} B.staticMethodInA();

Esto provocaría un error de: el método estático se puede invocar solo en la clase de interfaz que contiene .

interface A { static void staticMethodInA() {println();} } Class B implements A {} B.staticMethodInA(); // from here IntelliJ complaints..

¿Puede alguien decirme por qué el diseñador de Java 8 puede elegir tratar los 2 casos anteriores de manera diferente?


La adición de métodos static en la interfaz en Java 8 vino con 1 restricción: esos métodos no pueden ser heredados por la clase que los implementa. Y eso tiene sentido, ya que una clase puede implementar múltiples interfaces. Y si 2 interfaces tienen el mismo método static , ambos serían heredados y el compilador no sabría cuál invocar.

Sin embargo, con la clase extendida, eso no es problema. Los métodos de clase static son heredados por subclase.

Ver JLS §8.4.8 :

Una clase C hereda de su superclase directa todos los métodos concretos m (tanto estáticos como de instancia) de la superclase

...

Una clase C hereda de su superclase directa y superinterfaces directas todos los métodos abstractos y predeterminados (§9.4) m

...

Una clase no hereda métodos estáticos de sus superinterfaces.