0

Scraper静的内部クラスと呼ばれるクラスと、とBuilder呼ばれる非静的内部クラスStringPairがあります。ビルダーメソッドの1つを取得して、を構築してnew StringPair(a,b)に追加しようとArrayList<StringPair>していますが、コンパイラはコンパイルされません。問題の原因として、Error: non-static variable this cannot be referenced from a static contextと具体的に強調しています。new StringPair(a,b)

ここで何が悪いのかわかりません。助けていただければ幸いです。

class Scraper {

    private final ArrayList<StringPair> stringPairs;

    Scraper(Builder builder) {

        stringPairs = builder.builderStringPairs;


    }

    public static class Builder {

        private static ArrayList<StringPair> builderStringPairs = new ArrayList<StringPair>();

        public Builder addStringPairs(String a, String b) {

            builderStringPairs.add(new StringPair(a, b));
            return this;
        }

        public Scraper build() {
            return new Scraper(this);
        }

    }

    class StringPair {
        String a,b;

        StringPair(String a, String b) {
            this.a = a;
            this.b = b;

        }



        String getA() {
            return a;
        }
        String getB() {
            return b;
        }


    }

}
4

1 に答える 1

5

Builderは内部クラスではありません-それは単なるネストされたクラスであり、含まれているクラス(Scraper)のインスタンスへの暗黙の参照はありません。

StringPairただし、内部クラスです。のインスタンスを作成するにはStringPair、のインスタンスへの参照が必要ですScraper。だから、Builder仕事をするためのオプション:

  • 内部クラスにする(非静的)
  • ネストStringPairされたクラスを作成する(静的)
  • どこBuilderかにインスタンスを指定します。その時点で、次を使用できます。

    builderStringPairs.add(instance.new StringPair(a, b));
    

ここでは2番目のオプションが最も適切だと思います-のインスタンスへの参照がStringPair 必要な理由はわかりませんScraper

ネストされたクラスと内部クラスの詳細については、JLSのセクション8.1.3を参照してください。

于 2012-10-21T06:11:14.020 に答える