Java匿名内部类调用封闭类型超类型方法

时间:2018-10-11 19:28:17

标签: 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;
    }
}

在名为D的接口中,该实现创建一个匿名内部类,然后该匿名内部类需要调用超类型(BCa()实现。

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()无法成功编译,所以怎么了?

谢谢您的努力。

1 个答案:

答案 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.
};

为简洁起见,您可能已经省略了泛型,但是如果您没有这样做,则将要包括SetHashSet的类型参数。