2013-04-16 29 views
3

我已經打開java.util.ArrayList源代碼,並且我不明白一件事:爲什麼如果ArrayList被參數化,爲什麼elementData []數組的類型爲Object?java.util.ArrayList中的泛型

public class ArrayList<E> extends ... { 
    ......... 
    private transient Object[] elementData; 
    ......... 
    public boolean add(E e) {/*More code*/} 
} 

問題:爲什麼不定義爲從elementData:

private transient E[] elementData 

*有什麼優勢和劣勢?您創建與原始類型的列表,像

回答

1

每次:

列表<MyObject>名單=新的ArrayList <MyObject>();

的構造器的所有數據轉換成一個陣列,其必須是Object []數組,上:

公共的ArrayList(集合<? extends E> C){elementData中= c.toArray(); ...

我想這是因爲ArrayList中可以在沒有原始類型進行初始化,像:

名單列表=新的ArrayList();

list.add(new String("VALUE")); 
    list.add(new Integer("1")); 

    for (Object c : list) { 
     System.out.println(c.toString()); 
    } 

,你可以把裏面的不止一種類型的對象。

此外,ArrayList中使用

Arrays.copyOf(elementData中大小);

來管理一些操作,它將返回一個Object []。

你也可以看看herehere,就像Paul說的那樣。

+0

這並不能解釋爲什麼它不能是'E []' – newacct

+0

我把這個解釋放在其中一個鏈接上。 http://stackoverflow.com/questions/13776576/why-arraylist-implementation-uses-object –

+0

我知道你最後鏈接到「你也可以看看」。但是,否則這與這個問題沒有關係,爲什麼不是'E []' – newacct