Los métodos estáticos en las interfaces aparecieron a partir de Java 8. Se declaran con la palabra clave static y se implementan directamente en la interfaz. Los métodos estáticos no son heredados por las clases que los implementan, y se invocan a través del nombre de la interfaz.
interface MathUtils { static int sum(int a, int b) { return a + b; } }
MathUtils.sum(1, 2);Pregunta: ¿Puede un método estático de la interfaz ser llamado a través de un objeto de la clase que lo implementa?
Respuesta: No, el método estático de la interfaz siempre se llama a través del nombre de la interfaz, y no a través de una instancia o nombre de la clase de implementación. El siguiente ejemplo generará un error de compilación:
MathUtils utils = new SomeMathUtilsImpl(); utils.sum(1, 2); // ¡Error! Se necesita MathUtils.sum(1, 2)
Historia
Los desarrolladores intentaron erróneamente "sobrescribir" un método estático de la interfaz en la clase que lo implementa y esperaban invocar este método a través de una instancia. Como resultado, siempre se invocaba la versión de la interfaz, lo que conducía a una lógica comercial incorrecta durante el uso.
Historia
Al migrar métodos utilitarios de una clase a una interfaz, parte del código utilizó llamadas a través de un objeto:
obj.method(), lo que se volvió imposible, y se tuvo que refactorizar todas las llamadas aInterfaceName.method()en todo el proyecto.
Historia
El soporte para versiones antiguas de Java provocó errores de compilación después de agregar métodos estáticos a las interfaces. Los desarrolladores no comprobaron qué versión del compilador se estaba utilizando en CI, y el build comenzó a fallar regularmente.