gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:28:46 25 4
gpt4 key购买 nike

我有一个名为 Scraper 的类(class)具有静态内部类 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;
}


}

}

最佳答案

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

然而,

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

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

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

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

参见section 8.1.3 of the JLS有关嵌套类和内部类的更多信息。

关于java - 内部类不能构造其他内部类的新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12995446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com