Страницы

Поиск по вопросам

среда, 12 июня 2019 г.

Вызов default метода интерфейса из потомка, Java 8

Я хочу вызвать дефолтный метод из интерфейса, но компилятор это не пропускает.
public class HelloWorld{
public static void main(String []args){ B b = new B(); b.a(); } }
interface A{ default void a() { System.out.println("Hi from A.a"); } }
class B implements A { @Override public void a() { super.a(); // Error System.out.println("Hi from B.a"); } }
Если это нельзя сделать, обьясните пожалуйста почему.


Ответ

default методы добавлены для обеспечения обратной совместимости с ранними версиями Java
Используя их вы можете расширить уже существующий интерфейс не ломая код, который написан для предыдущей версии интерфейса. Все, что будет нужно - это перекомпилировать его. А так как в предыдущей версии этого метода не было, то вы не можете его вызвать используя super
Вам нужно использовать абстрактный класс вместо интерфейса или не переопределять метод интереса.
Абстрактный класс
public class HelloWorld{ public static void main(String []args){ B b = new B(); b.a(); } }
abstract class A { void a() { System.out.println("Hi from A.a"); } }
class B extends A { @Override public void a() { super.a(); System.out.println("Hi from B.a"); } }
Интерфейс
public class HelloWorld{ public static void main(String []args){ B b = new B(); b.a(); } }
interface A{ default void a() { System.out.println("Hi from A.a"); } }
class B implements A { }

Комментариев нет:

Отправить комментарий