Статические методы в интерфейсах появились начиная с Java 8. Они объявляются с ключевым словом static и реализуются прямо в интерфейсе. Статические методы не наследуются реализующими классами, а вызываются через имя интерфейса.
interface MathUtils { static int sum(int a, int b) { return a + b; } }
MathUtils.sum(1, 2);Вопрос: Может ли статический метод интерфейса быть вызван через объект реализующего класса?
Ответ: Нет, статический метод интерфейса всегда вызывается через имя интерфейса, а не через экземпляр или имя класса-реализации. Пример вызовет ошибку компиляции:
MathUtils utils = new SomeMathUtilsImpl(); utils.sum(1, 2); // Ошибка! Нужно MathUtils.sum(1, 2)
История
Разработчики ошибочно пытались "переопределить" статический метод интерфейса в реализующем классе и ожидали вызова этого метода через экземпляр. В итоге всегда вызывалась версия из интерфейса, что приводило к неверной бизнес-логике во время использования.
История
При миграции утилитарных методов из класса в интерфейс часть кода использовала вызов через объект:
obj.method(), что стало невозможно, пришлось рефакторить вызовы наInterfaceName.method()по всему проекту.
История
Поддержка старых версий Java привела к ошибкам компиляции после добавления статических методов в интерфейсы, разработчики не проверили, какая версия компилятора используется в CI, и билд начал регулярно падать.