Sel*_*ile 4 java anonymous-inner-class default-method
我举一个例子来设置一些上下文,所以我有两个接口,每个接口继承相同的父接口并定义它们自己的父接口的抽象方法的实现.
interface A
{
Set a();
}
interface B extends A
{
@Override
default Set a()
{
return null;
}
}
interface C extends A
{
@Override
default Set a()
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
在一个名为的接口中D,该实现创建了一个匿名内部类,然后需要调用超类型(B和C)a()实现.
interface D extends B, C
{
@Override
default Set a()
{
return new HashSet()
{
{
final int totalSize = D.this.B.super.a().size() + D.this.C.super.a().size();
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
问题是表达式D.this.B.super.a()并D.this.C.super.a()没有成功编译,所以是什么?
谢谢你的努力.
Java允许您使用以下语法访问特定的接口实现:
InterfaceName.super.method()
Run Code Online (Sandbox Code Playgroud)
但是,在匿名类中获取封闭实例D.this.不允许将这些语法组合起来先获取封闭实例,然后再实现其超级接口实现.
这里的解决方案是移动totalSize匿名类外部的声明,以便您可以访问超级接口实现.匿名类仍然可以引用局部变量,totalSize因为它是final.(如果它实际上是最终的,它仍然可以访问它 - 不是final但从未重新分配.)
final int totalSize = B.super.a().size() + C.super.a().size();
return new HashSet()
{
// Anonymous class implementation here.
// You can refer to totalSize.
};
Run Code Online (Sandbox Code Playgroud)
为简洁起见,您可能省略了泛型,但如果不这样做,则需要为Set和包含类型参数HashSet.