我有一个名为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;
}
}
}
答案 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。