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()试图来包装this的B,并且具有B::doB()调用它的超强功能A.super.doA().
我可以打电话给A.super.doA()一个类型的lambda B就好了.但我无法弄清楚A.super.doA()
在匿名内部调用的语法B.请参阅注释掉的代码.
有任何想法吗?
正如这个答案中所说,由于this和的含义不同super(与内部类相比),这在 lambda 表达式中是可能的。
Java\xc2\xae 语言规范 \xc2\xa715.12.1中明确解决了无法对内部类执行相同操作的问题:
\n\n\n\nTypeName语法是重载的:传统上,TypeName 引用词法封闭类型声明,它是一个类,并且目标是该类的超类,就好像调用是词法封闭类型声明中的非限定。
\n\n.supersuper\xe2\x80\xa6
\n\n为了支持调用超级接口中的默认方法,TypeName还可以引用当前类或接口的直接超级接口,并且目标是该超级接口。
\n\n\xe2\x80\xa6
\n\n没有语法支持这些形式的组合,即调用词法封闭类型声明(是一个类)的超级接口方法,就好像调用是词法封闭类型声明中的InterfaceName形式一样。
\n\n.superRun Code Online (Sandbox Code Playgroud)\n\nclass 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\n
private解决方法是在词法封闭类型声明中引入一个执行接口super调用的方法。
| 归档时间: |
|
| 查看次数: |
260 次 |
| 最近记录: |