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

Почему я не могу использовать статический метод реализованного интерфейса?

Как вы, специалисты, знаете в Java 8, интерфейсы могут иметь статические методы, которые имеют реализации внутри себя.

Как я прочитал в соответствующем учебнике, классы, реализующие такой интерфейс, могут использовать свои статические методы. Но у меня есть проблема, которая здесь я показываю в более простом примере, чем то, что у меня есть

public interface Interface1{
    public static void printName(){
        System.out.println("Interface1");
    }
}

когда я реализую такой интерфейс

public class Class1 implements Interface1{
    public void doSomeThing() {
        printName();
    }
}

Я вижу ошибку компиляции.

The method printName() is undefined for the type Class1

В чем проблема?

4b9b3361

Ответ 1

Из спецификации языка Java,

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

  • [...]

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

  • [...]

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

Таким образом, этот метод не наследуется.

Вы можете статически импортировать элемент

import static com.example.Interface1.printName;
...
printName();

или использовать его с полным именем типа

com.example.Interface1.printName();

или импортируйте тип, к которому принадлежит printName, и вызовите его с его коротким именем

import static com.example.Interface1;
...
Interface1.printName();