簡體   English   中英

Java匿名內部類調用封閉類型超類型方法

[英]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的接口中,實現創建一個匿名內部類,然后需要調用超類型( 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()

但是,在匿名類中,用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類型參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM