Javaの匿名内部クラス型超タイプのメソッドを呼び出す囲みます

Selenophile:

私はあなたにここにいくつかのコンテキストを設定する例を与えるので、私は2つのインタフェースがそれぞれ同じ親インターフェイスを継承し、親インタフェースの抽象メソッドの独自の実装を定義しています。

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してCa()実装を。

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()何アップしているので、正常にコンパイルされませんか?

あなたの努力のための道でいただきありがとうございます。

rgettman:

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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=185916&siteId=1
おすすめ