【问题标题】:Java anonymous inner class calling enclosing type super types methodJava匿名内部类调用封闭类型超类型方法
【发布时间】:2019-03-16 23:29:49
【问题描述】:

我给你一个例子来在这里设置一些上下文,所以我有两个接口,每个接口都继承相同的父接口并定义它们自己的父接口抽象方法的实现。

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()没有编译成功,怎么回事?

顺便感谢你的努力。

【问题讨论】:

  • "编译不成功"是什么错误?

标签: java anonymous-inner-class default-method


【解决方案1】:

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 的类型参数。

【讨论】:

  • 确保B.super.a()C.super.a() 都不返回null
  • 并且不要使用原始类型
  • @AndrewTobilko 冷静老兄,我使用 null 作为返回表达式和原始类型仅用于设置上下文目的。
  • 尽管如此,关于检查 null 和不使用原始类型的要点对于查看这篇文章的其他人很有用。
  • @rgettman 感谢您的回复,并随时编辑我的问题,以便其他观众可以轻松阅读:)
猜你喜欢
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-05
  • 1970-01-01
  • 2013-05-24
相关资源
最近更新 更多