2012-08-27 42 views
0

我期待重新發明輪子,並創建自己的通用數組支持列表類,類似於ArrayList。是的,我知道這很愚蠢,但這是一種學術追求。問題是,你不能實例化一個泛型類型如何在Java中創建通用列表?

public class MySuperCoolList<E> { 
    E[] array; 

    public MySuperCoolList<E>() { 
     array = new E[10]; // ERROR: cannot do this! 
    } 
} 

數組當然必須有一個解決這個問題,因爲Java的ArrayList的是做同樣的事情。問題是,如何?我如何實例化一個通用類型的數組E?它是如何在ArrayList中完成的(如果有人知道)?

+1

'ArrayList'保持其元素Object's的'陣列('對象[]')內部。這是不可能的(不提前知道類型)來創建通用數組。 – MadProgrammer

+0

可能的重複[Java如何:通用數組創建](http://stackoverflow.com/questions/529085/java-how-to-generic-array-creation) – Neil

+0

你可能是C#背景嗎? –

回答

4

它是如何在ArrayList中完成的(如果有人知道)?

它是開源的。看看在source code for ArrayList

/** 
* The array buffer into which the elements of the ArrayList are stored. 
* The capacity of the ArrayList is the length of this array buffer. 
*/ 
private transient Object[] elementData; 
+0

哦,我沒有意識到它是開源的。幹得好!那麼泛型下面是一堆鑄造呃?好開心。謝謝! – mtmurdock

+0

@mtmurdock - Java標準庫源代碼從第一天開始免費提供。在Java開源之前。 –

+1

@mtmurdock是的,這真的是所有的Java泛型 - 編譯時檢查,然後一堆鑄造。如果您想更多地閱讀關鍵字,則該關鍵字是「刪除」。 – yshavit

0

在這種情況下,你可能想使用對象類型的數組,原因對象類型可容納一切,代碼是這樣,

public class MySuperCoolList<E> { 
    Object[] array; 

    public MySuperCoolList() { 
     array = new Object[10]; 
    } 

    public E get(int index){ 
     return (E) array[index]; 
    } 

    public void put(int index,E val) { 
     array[index] = val; 
    } 

} 
0
public MySuperCoolList<E>(final Class<? extends E> type) { 
    array = (E[]) Arrays.newInstance(type, 10); 
} 

Arrays.newInstance。這就是Arrays.copyOf的工作原理。

我已經放置了PoC here

int[] vals = (int[]) Array.newInstance(Integer.TYPE, 10); 
vals[0] = 500; 
System.out.println(vals); 
System.out.println(vals.length); 
System.out.println(Arrays.toString(vals)); 

正如你可以看到,如預期的輸出:

[[email protected] 
10 
[500, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
+0

問題在於,消費者必須通過該類作爲參數,這將是多餘的。我正在嘗試創建一個像ArrayList一樣工作的集合。 – mtmurdock

+0

冗餘?我真的不這麼認爲。 – oldrinb

+0

你不覺得在構造函數中必須兩次輸入類是多餘的嗎?幹我的朋友,幹。 – mtmurdock