Java 内部类无法构造其他内部类的新实例

Java 内部类无法构造其他内部类的新实例,java,Java,我有一个名为Scraper的类,其中包含一个静态内部类Builder,还有一个名为StringPair的非静态内部类,我试图获得一个Builder方法来构造一个新的StringPair(a,b),并将其添加到数组列表中,但它不编译,编译器说Error:non-static variable这不能从静态上下文引用,并特别强调新的字符串对(a,b)是问题的根源 我不明白这里出了什么问题,任何帮助都将不胜感激 class Scraper { private final ArrayList&l

我有一个名为
Scraper
的类,其中包含一个静态内部类
Builder
,还有一个名为
StringPair
的非静态内部类,我试图获得一个Builder方法来构造一个
新的StringPair(a,b)
,并将其添加到
数组列表中,但它不编译,编译器说
Error:non-static variable这不能从静态上下文引用
,并特别强调
新的字符串对(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;
        }


    }

}
类刮刀{
私有最终数组列表字符串对;
铲运机(建筑商){
stringPairs=builder.builderStringPairs;
}
公共静态类生成器{
私有静态ArrayList builderStringPairs=new ArrayList();
公共生成器addStringPairs(字符串a、字符串b){
builderStringPairs.add(新的StringPair(a,b));
归还这个;
}
公共建筑({
返回新刮刀(本);
}
}
类字符串对{
a、b串;
字符串对(字符串a、字符串b){
这个a=a;
这个.b=b;
}
字符串getA(){
返回a;
}
字符串getB(){
返回b;
}
}
}

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

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

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

    builderStringPairs.add(instance.new StringPair(a, b));
    
我怀疑第二个选项在这里最合适-我看不出为什么
StringPair
需要引用
Scraper
的实例


有关嵌套类和内部类的详细信息,请参见。

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

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

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

    builderStringPairs.add(instance.new StringPair(a, b));
    
我怀疑第二个选项在这里最合适-我看不出为什么
StringPair
需要引用
Scraper
的实例


有关嵌套类和内部类的更多信息,请参阅。

好的,谢谢,我不知道。好的,谢谢,我不知道。谢谢,我从您的答复中找到了解决方案。实际上,我需要生成器是静态的,因为它是一个生成器,我需要StringPair是非静态的,因为我需要为ArrayList创建它的实例。所以问题是静态内部类无法“看到”非静态内部类,所以我只是拿出StringPair,将其作为一个单独的顶级类,现在它可以工作了。@Sindikalis:你误解了,你必须回头再看一次,以避免下次出现问题。
StringPair
不需要是非静态的:“因为我需要为ArrayList创建它的实例”,这并不意味着它需要是一个内部类。您仍然可以创建静态嵌套类的实例——毕竟您正在创建生成器的实例。它只是改变是否存在对包含类实例的隐式引用。好的,谢谢,我真的很感谢你的帮助!我想我需要进一步研究这个问题。谢谢,我从你的回复中找到了解决方案。实际上,我需要生成器是静态的,因为它是一个生成器,我需要StringPair是非静态的,因为我需要为ArrayList创建它的实例。所以问题是静态内部类无法“看到”非静态内部类,所以我只是拿出StringPair,将其作为一个单独的顶级类,现在它可以工作了。@Sindikalis:你误解了,你必须回头再看一次,以避免下次出现问题。
StringPair
不需要是非静态的:“因为我需要为ArrayList创建它的实例”,这并不意味着它需要是一个内部类。您仍然可以创建静态嵌套类的实例——毕竟您正在创建生成器的实例。它只是改变是否存在对包含类实例的隐式引用。好的,谢谢,我真的很感谢你的帮助!我想我需要进一步调查一下。