内部类不能构造其他内部类的新实例

时间:2012-10-21 06:05:50

标签: java

我有一个名为Scraper的类,其中包含静态内部类Builder,还有一个名为StringPair的非静态内部类,我正在尝试获取其中一个构建器方法构造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;
        }


    }

}

1 个答案:

答案 0 :(得分:5)

Builder不是内部类 - 它只是一个嵌套类,没有对包含类(Scraper)的实例的隐式引用。

StringPair但是, 是一个内部类。为了构造StringPair的实例,您需要引用Scraper的实例。因此,使Builder工作的选项:

  • 使其成为内部类(非静态)
  • 使StringPair成为嵌套类(静态)
  • 在某个地方提供Builder个实例,此时您可以使用:

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

我怀疑第二个选项是最适合的选项 - 我看不出StringPair 需要引用Scraper实例的任何原因。

有关嵌套类和内部类的更多信息,请参阅section 8.1.3 of the JLS