从匿名内部类调用重写的默认方法

Ale*_*ing 5 java super anonymous-class java-8 default-method

考虑以下代码:

interface A {
    default void doA() {
        System.out.println("a");
    } 
}

interface B {
    void doB(); 
}

class Test implements A {

    @Override
    public void doA() {        
        // Works
        B b = () -> A.super.doA();
        b.doB();

        // Does not compile
        /*
        new B() {      
            public void doB() {  
                A.super.doA();
            }       
        }.doB();
        */
    }

    public static void main(String[] args) {
        new Test().doA();
    }

}
Run Code Online (Sandbox Code Playgroud)

这是做作,但基本上Test::doA()试图来包装thisB,并且具有B::doB()调用它的超强功能A.super.doA().

我可以打电话给A.super.doA()一个类型的lambda B就好了.但我无法弄清楚A.super.doA() 在匿名内部调用的语法B.请参阅注释掉的代码.

有任何想法吗?

Hol*_*ger 2

正如这个答案中所说,由于this和的含义不同super(与内部类相比),这在 lambda 表达式中是可能的。

\n\n

Java\xc2\xae 语言规范 \xc2\xa715.12.1中明确解决了无法对内部类执行相同操作的问题:

\n\n
\n

TypeName语法是重载的:传统上,TypeName 引用词法封闭类型声明,它是一个类,并且目标是该类的超类,就好像调用是词法封闭类型声明中的非限定。. supersuper

\n\n

\xe2\x80\xa6

\n\n

为了支持调用超级接口中的默认方法,TypeName还可以引用当前类或接口的直接超级接口,并且目标是该超级接口。

\n\n

\xe2\x80\xa6

\n\n

没有语法支持这些形式的组合,即调用词法封闭类型声明(是一个类)的超级接口方法,就好像调用是词法封闭类型声明中的InterfaceName形式一样。 . super

\n\n
class Subclass3 implements Superinterface {\n    void foo() { throw new UnsupportedOperationException(); }\n\n    Runnable tweak = new Runnable() {\n        void run() {\n            Subclass3.Superinterface.super.foo();  // Illegal\n        }\n    };\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

private解决方法是在词法封闭类型声明中引入一个执行接口super调用的方法。

\n
\n