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)
Esta pregunta ya tiene una respuesta aquí:
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.