[英]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
的接口中,實現創建一個匿名內部類,然后需要調用超類型( 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()
沒有成功編譯,所以是什么?
謝謝你的努力。
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
類型參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.