Можете ли вы вызвать метод по умолчанию родительского интерфейса из интерфейса, который подclassифицирует этот интерфейс?

В java 8 у меня есть что-то вроде этого:

package test; public class SimpleFuncInterfaceTest { public static void carryOutWork(AFunctionalInterface sfi){ sfi.doWork(); } public static void main(String[] args) { carryOutWork(() -> System.out.println("Do work in lambda exp impl...")); AImplementor implementsA = new AImplementor(); //carryOutWork(() -> implementsA.doWork()); BImplementor implementsB = new BImplementor(); carryOutWork(() -> implementsB.doWork()); } } @FunctionalInterface interface AFunctionalInterface { public void doWork(); default public void doSomeWork(){ System.out.println("FOO"); } } @FunctionalInterface interface BFunctionalInterface extends AFunctionalInterface { @Override default public void doSomeWork(){ System.out.println("BAR");//Unreachable in same object? } } class AImplementor implements AFunctionalInterface { @Override public void doWork() { doSomeWork(); } } class BImplementor extends AImplementor implements BFunctionalInterface { public void doSomeWork(){ super.doSomeWork(); new BFunctionalInterface(){ @Override public void doWork() { }}.doSomeWork(); System.out.println("WUK WUK"); } @Override public void doWork() { doSomeWork(); } } 

Есть ли способ вызвать поведение функционального интерфейса по умолчанию из implementsB, не создавая анонимный внутренний class и ссылаясь на это?

Это имеет побочный эффект (вызов метода implementsA 2 раза), то, что нужно, является вызовом реализации родителя, а затем реализация childs может вызвать реализацию по умолчанию дочернего элемента, а также, при необходимости, специальную специализацию. Поскольку вы можете видеть, что вызов родительской реализации мертв легко, но я не вижу способа избежать повторной записи реализации по умолчанию, если я не добавлю слой косвенности к classу, который реализует дочерний интерфейс, и никоим образом не применять этот ,

Например, если A разблокированный или предоставленный доступ к ресурсу говорит базу данных, а B разблокирует второй ресурс (другая firebase database), я не вижу возможности сделать разблокировку кода A, а затем B, применяя этот контракт, используя функциональные интерфейсы, требуя, чтобы A и B. На одном уровне вы можете это сделать, но уровни N уровней выглядят так, как будто это невозможно.

Я намеревался использовать lambda, чтобы избежать дорогостоящих вызовов, но чтобы обеспечить соблюдение семантического порядка операций с пользователями моей библиотеки.

Этот вопрос не совсем то же самое, что «Явное вызов метода по умолчанию в Java», так как этот вопрос касается глубин интерфейсов N уровней, а не просто вызова метода по умолчанию для родительских интерфейсов.

    Вы можете вызвать метод унаследованного interface default используя InterfaceName.super . Правила те же, что и для других вызовов super метода: вы можете вызвать унаследованный метод, который вы переопределили, но вы не можете напрямую вызывать метод, который унаследованный метод мог бы переопределить. Например

     interface A { void foo(); default void toOverride() { System.out.println("A"); } } interface B extends A { default void toOverride() { A.super.toOverride(); System.out.println("B"); } } interface C extends B { default void toOverride() { A.super.toOverride();// does not work B.super.toOverride(); System.out.println("B"); } } class D implements B { public void toOverride() { } public void foo() { D.this.toOverride(); B.super.toOverride(); A.super.toOverride(); // does not work! } } 

    Но если каждый метод переопределения вызывает свой супер-метод, у вас есть цепочка вызовов. Однако имейте в виду, что мы говорим о интерфейсах. Реализация всегда может переопределять метод по умолчанию, не вызывая вообще super .

    Давайте будем гением компьютера.