Абстрактные методы не определяют тело - Интерфейс, пытающийся реализовать метод суперинтерфейса, дающий ошибку времени компиляции в JDK 8 - PullRequest
0 голосов
/ 01 декабря 2018

В настоящее время я пытаюсь изучить JDK 8 функции и новые возможности, которые мы можем реализовать в интерфейсе.Вот так

interface SuperInt {
    public static void method1() {  // completely qualified
        System.out.println("method1");
    }

    public default void method2() {   // completely qualified
        System.out.println("method2");
    }

    public void method3();   // completely qualified
}

Но когда я пытался расширить этот интерфейс и пытался реализовать его в подчиненном интерфейсе, это приводило к ошибке времени компиляции.

Абстрактные методы делаютне указывать тело

interface SubInt extends SuperInt {
    public void method3() {  //  compile time error

    }
}

Если можно сохранить реализованные методы в интерфейсе, то почему это приведет к ошибке, пока мы пытаемся реализовать метод суперинтерфейса abstarct в его интерфейсе?подчиненный интерфейс?

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Вы не можете реализовать абстрактный метод в interface, и SubInt все еще является interface, а не class, поскольку

interface SubInt extends SuperInt

пытается расширить интерфейс и не реализует it.Для его реализации вы должны использовать

public class SuperIntImpl implements SuperInt {
    @Override
    public void method3() {

    }
}

С другой стороны, method2 - это метод default, поэтому он компилируется с реализацией.


пример SubInt и SuperInt с переопределенной реализацией по умолчанию в SubInt, надеюсь, этот пример прояснит ситуацию:

public interface SuperInt {
    void method3(); 
    void method4();
}

public interface SubInt extends SuperInt {
    @Override 
    default void method3() { 
        System.out.println("Inside SubInt");
    }
}

, тогда как реализация SubInt теперь может выбрать переопределение или нетmethod3, необходимо по-прежнему реализовывать method4 как

public class SubIntImpl implements SubInt {
    @Override
    public void method4() {

    }
    // can reuse the implementation of the 'method3'
}

, и для любой реализации SuperInt все равно необходимо иметь собственную реализациюmethod3 и method4

public class SuperIntImpl implements SuperInt {

    @Override
    public void method3() {
         // must have my own implementation
    }

    @Override
    public void method4() {
        // must have my own implementation
    }
}
0 голосов
/ 01 декабря 2018

Но когда я попытался расширить этот интерфейс и попытаться реализовать его в подчиненном интерфейсе, выдается ошибка времени компиляции.

Вместо этого вы не пытались реализовать его,вы определяете новый абстрактный метод.

public void method3() {  //  compile time error

}

, если вы хотите обеспечить реализацию, добавьте префикс объявления метода с ключевым словом default:

public default void method3() {  //  compile time error
      ...
}
...