Подтвердить что ты не робот

В java 8 почему нельзя вызвать статический метод интерфейса, который реализует текущий класс

Я недавно играю в Java 8 новых функций и наблюдаю интересное поведение:

Это нормально:

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

B.staticMethodInA();

Это вызовет ошибку: статический метод может быть вызван только при наличии класса интерфейса.

interface A { static void staticMethodInA() {println();} }
Class B implements A {}

B.staticMethodInA(); // from here IntelliJ complaints..

Может кто-нибудь сказать мне, почему разработчик Java 8 может по-разному рассматривать вышеприведенные два случая?

4b9b3361

Ответ 1

Добавление методов static в интерфейсе в Java 8 имело 1 ограничение - эти методы не могут быть унаследованы классом, реализующим его. И это имеет смысл, поскольку класс может реализовывать несколько интерфейсов. И если 2 интерфейса имеют один и тот же метод static, они оба наследуются, а компилятор не будет знать, какой из них вызывать.

Однако с расширением класса это не проблема. Методы класса static наследуются подклассом.

См. JLS & sect; 8.4.8:

Класс C наследует от своего прямого суперкласса все конкретные методы m (как статические, так и экземпляры) суперкласса

...

Класс C наследует от своего прямого суперкласса и прямых суперинтерфейсов все абстрактные и дефолтные (§9.4) методы m

...

Класс не наследует статические методы из его суперинтерфейсов.