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创建它的实例”,这并不意味着它需要是一个内部类。您仍然可以创建静态嵌套类的实例——毕竟您正在创建生成器的实例。它只是改变是否存在对包含类实例的隐式引用。好的,谢谢,我真的很感谢你的帮助!我想我需要进一步调查一下。