2013-05-12 41 views
1

我正在理解Java中泛型的概念。我無法理解以下幾行代碼。瞭解Java中列表的列表

import java.util.List; 
import java.util.ArrayList; 


public final class Main { 
    public static final void main(final String[] args) { 
     final List<A> listA = new ArrayList<Main.A>(); 
     //listA.add(new Main.B()); // i understood why this line is an error. 

     final List<List<A>> listListA = new ArrayList<List<A>>(); 
     listListA.add(new ArrayList<Main.A>()); 
     // Why the above line doesn't throws an error ? 
    } 

    private class A { 
    } 


    private final class B extends A { 
    } 
} 
+0

您是指編譯器錯誤或運行時錯誤? – OldProgrammer 2013-05-12 01:52:11

+0

編譯時錯誤 – 2013-05-12 01:54:04

+0

代碼編譯。沒有錯誤。 http://ideone.com/YetaPJ – 2013-05-12 01:55:28

回答

3

在第一種情況下,listA.add(new Main.B()),因爲B是一個非靜態內部類,它必須持有this參考外部類這給編譯錯誤。因此,實例化B需要外部類中的非靜態上下文,所以它不能在靜態方法中實例化。

在第二種情況下,ArrayList<A>延伸List<A>,所以List<List<A>>還可以含有的ArrayList<A>實例。這不會像第一種情況那樣給出錯誤的原因是A的實例實際上並未創建,所以這沒問題。

+3

@RaviTrivedi只有具有私有構造函數的類不能被實例化。可以啓動私有構造函數以外的私人類.. – 2013-05-12 02:27:45

+0

感嘆。 @Ravi,看,當OP說有錯誤時,如果我沒有編譯代碼並自己測試,我不會聲稱沒有錯誤。它編譯,運行併成功,沒有錯誤。 – javic 2013-05-12 02:29:46

+0

啊,我明白了。你說了一點。但是,這不是因爲該類是私有的,您不能實例化它。我正在更新我的答案以反映原因。 – javic 2013-05-12 02:40:37

1

讓我們來談談。

在這一行,final List<A> listA = new ArrayList<Main.A>(),它創建了一個ArrayList來保存這種類型A.思考的對象爲其中每個槽容納A.

在該線的陣列,final List<List<A>> listListA = new ArrayList<List<A>>()還創建ArrayList但在這種情況下每個插槽都有一個列表A

listListA.add(new ArrayList()); //爲什麼上面的行不會引發錯誤?

它不會拋出錯誤的原因是因爲聲明是有效的。您正在添加您創建的列表中的A(在一個插槽中)的ArrayList

希望這會有所幫助。

1

代碼編譯良好,沒有任何錯誤。此行listListA.add(new ArrayList<Main.A>());不會引發錯誤,因爲它是有效的Java語句。