簡體   English   中英

實例化類的內部類

[英]Instantiating inner class of class

基本上,我有一個帶有通用T的Java類Foo和一個內部類Foo2,該類以某種方式使用了此通用T,例如以下示例:

public class Foo<T>
{
  public class Foo2
  {
    private T t;
    public void setObject(T t)
    {
       this.t = t;
    }
  }
}

在嘗試並出錯(直到編譯器不會引發警告或錯誤)之后,如何創建此內部類Foo2的實例,我想到了以下內容:

Foo<String> foo = new Foo<String>();
Foo2 foo2 = foo.new Foo2();

第二行foo.new Foo2(); 對我來說是新事物,我不知道我在這里到底在做什么。 對於我來說,很明顯,類Foo2的實例必須知道T是什么類,但是語法foo.new對我來說是新的。 我在這是要干嘛?

foo.new Foo2()語法與泛型無關。 這是通過提供封閉類的實例來實例化內部類的方法。

內部類是在另一個內部聲明的類,不使用static關鍵字。 內部類的實例必須屬於外部類的實例。 例如,內部類的一個很好的例子可能是

public class School {

    public class Pupil {

    }
}

每個Pupil都必須屬於School因此如果沒有School ,您將無法構建Pupil實例。 你可以做

School school = new School();
School.Pupil pupil = school.new Pupil();

第二行創建一個屬於特定School的新Pupil

Pupil課堂上,通過School.this可以得到學生所屬的學校。 您可以通過執行School.this.someField來使用School類的School.this.someField

如果您希望能夠在沒有Foo實例的情況下創建Foo2實例,則可以編寫

public static class Foo2

代替。 在大多數情況下,您可能應該優先使用靜態嵌套類而不是內部類。

內部類(與靜態內部類相對)與外部類的特定實例相關聯。

foo.new通過foo變量將內部類的新實例與外部類的foo.new關聯。

這與泛型無關。

暫無
暫無

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

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