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

Java anonymous inner class calling enclosing type super types 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 的接口中,该实现创建了一个匿名内部 class,然后需要调用超类型(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() 没有编译成功,怎么回事?

顺便谢谢你的努力。

Java 允许您使用以下语法访问特定接口实现:

InterfaceName.super.method()

但是,在匿名class 内部获取带有D.this 的封闭实例。不允许组合这些语法首先获取封闭实例,然后获取其超接口实现。

这里的解决方案是将 totalSize 的声明移到匿名 class 之外,以便您可以访问超级接口实现。匿名 class 仍然可以引用局部变量 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 的类型参数。