簡體   English   中英

內部類不能構造其他內部類的新實例

[英]Inner class cannot construct new instance of other inner class

我有一個名為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;
        }


    }

}

Builder不是內部類,它只是一個嵌套類,沒有對包含類( Scraper )的實例的隱式引用。

但是, StringPair 內部類。 為了構造StringPair的實例,您需要引用Scraper的實例。 因此,使Builder工作的選項:

  • 使其成為內部類(非靜態)
  • 使StringPair成為嵌套類(靜態)
  • 在某個地方為Builder一個實例,此時可以使用:

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

我懷疑第二個選項在這里是最合適的-我看不到StringPair 需要引用Scraper實例的任何原因。

有關嵌套類和內部類的更多信息,請參見JLS的8.1.3節

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM