Java 8 представляет методы по умолчанию, чтобы обеспечить возможность расширения интерфейсов без необходимости изменять существующие реализации.
Интересно, возможно ли явно вызвать реализацию метода по умолчанию, когда этот метод был переопределен или недоступен из-за противоречивых реализаций по умолчанию в различных интерфейсах.
interface A {
default void foo() {
System.out.println("A.foo");
}
}
class B implements A {
@Override
public void foo() {
System.out.println("B.foo");
}
public void afoo() {
// how to invoke A.foo() here?
}
}
Учитывая приведенный выше код, как бы вы вызвали A.foo()
метод класса B?
Ответы:
Согласно этой статье вы получаете доступ к методу по умолчанию в интерфейсе,
A
используяЭто можно использовать следующим образом (при условии, что интерфейсы
A
иC
оба имеют методы по умолчаниюfoo()
)A
иC
могут иметь.foo()
методы, и может быть выбрана конкретная реализация по умолчанию, или вы можете использовать один (или оба) как часть вашего новогоfoo()
метода. Вы также можете использовать тот же синтаксис для доступа к версиям по умолчанию в других методах в вашем классе реализации.Формальное описание синтаксиса вызова метода можно найти в главе 15 JLS .
источник
A extends SomeOtherInterface
иSomeOtherInterface
имеетdefault Type method()
, то вы не можете просто позвонитьSomeOtherInterface.super.method()
из ChildClass. Вы можете вызывать только методы по умолчанию для интерфейсов, перечисленных в разделеChildClass
'simplements
, а не методы их родительских интерфейсов.super.super.someMethod();
(потому что это было бы ужасно)Код ниже должен работать.
Вывод:
источник
Этот ответ написан в основном для пользователей, которые приходят с закрытого вопроса 45047550 .
Интерфейсы Java 8 представляют некоторые аспекты множественного наследования. Методы по умолчанию имеют реализованную функцию body. Для вызова метода из суперкласса вы можете использовать ключевое слово
super
, но если вы хотите сделать это с помощью суперинтерфейса, необходимо явно назвать его.Вывод:
источник
Вам не нужно переопределять метод интерфейса по умолчанию. Просто назовите это так:
Вывод:
источник