我为您提供了一个在此处设置一些上下文的示例,因此,我有两个接口,每个接口都继承相同的父接口并定义其自己的父接口抽象方法的实现。
interface A
{
Set a();
}
interface B extends A
{
@Override
default Set a()
{
return null;
}
}
interface C extends A
{
@Override
default Set a()
{
return null;
}
}
在名为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();
}
};
}
}
问题是表达式D.this.B.super.a()
和D.this.C.super.a()
无法成功编译,所以怎么了?
谢谢您的努力。
答案 0 :(得分:6)
Java允许您使用以下语法访问特定的接口实现:
InterfaceName.super.method()
但是,在匿名类内部使用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.
};
为简洁起见,您可能已经省略了泛型,但是如果您没有这样做,则将要包括Set
和HashSet
的类型参数。