2011-06-15 82 views
0

我寫了一個接受泛型類的類,我試圖在其中創建一個泛型數組的數組列表。我明白Java can't create generic arrays,但我也知道there are workarounds。下面的代碼可以工作,或者我吠叫錯誤的樹嗎?如何在Java中創建通用數組的列表?

public class IterableContainer<T extends IterableItem> { 
    private T[] itemArray; 

    // how can i get this following line to work? 
    private List<T[]> items = new ArrayList<T[10]>(); 

    public IterableContainer() { 

... etc ... 

忽略過去 - 這是一個IDE問題。
留下問題和答案的連續性。

編輯:

這也不起作用:

private List<T[]> items = new ArrayList<T[]>(); 

與錯誤:

Syntax error on token ">", VariableDeclaratorId expected after this token

回答

4

」 ......找錯了樹...,使用List<List<T>>。使用原始陣列在Java中幾乎總是一個代碼味道,沒有理由不使用正確的集合類。

+0

我正在爲移動設備開發,所以請儘可能使用基本類型,因爲它認爲資源不足。這是我不應該擔心的事嗎? – Martyn 2011-06-15 13:35:27

+3

你過早地優化 – 2011-06-15 16:40:52

+1

@Martyn:一個ArrayList只是一個有幾個字節開銷和一個更好的接口的數組。它會稍微慢一些,並且會封裝你在通用數組中遇到的所有麻煩。 – 2011-06-15 16:54:46

4

它工作得很好,你就不能使用T[10]聲明因爲數組的長度不會影響其類型。

... = new ArrayList<T[]>(); 

並不是說這是一個好主意,但它應該有可能與通用陣列一如既往同樣的限制。創建東西到放在你的列表中會讓你頭疼。

+0

這是我最初的,但它給了我一個在Eclipse中的問題(雖然它沒有強調任何錯誤) - 「令牌上的語法錯誤」>「,在該令牌之後預期的VariableDeclaratorId」。這僅僅是一個Eclipse問題還是有更多的東西? – Martyn 2011-06-15 13:32:57

+0

它在這裏運行得很好(NetBeans)。也許你的錯誤在別的地方。 – toto2 2011-06-15 14:23:40

+1

停止使用Eclipse作爲某種Java語法的權限。唉唉! – irreputable 2011-06-15 18:06:15

-1

您還沒有如果創建一個通用類在此代碼中定義牛逼

,你需要寫:

public class <T extends IterableItem> IterableContainer...

下一個問題你的鱈魚e是你正在嘗試初始化ArrayList的構造過程中的項目。是不可能的。你還是寫:

private List<T[]> items = new ArrayList<T[]>();

+1

你在想通用方法。他的代碼在通用參數方面很好。 – 2011-06-15 13:28:31

+0

對不起,你是對的。 – 2011-06-15 13:30:33

1
private List<T[]> items = new ArrayList<T[]>(); 

工作正常在我的機器

當你說:「我爲移動設備開發」 ......你針對J2ME?在j2metargetng中沒有對仿製藥的支持

+0

應該說 - 我正在開發的android,所以沒有J2ME問題在這裏 – Martyn 2011-06-16 08:26:42

1

這是java中的一個有效聲明(根據規範),並且像其他人評論的那樣用javac編譯得很好。

public class IterableContainer<T extends IterableItem> { 
    private T[] itemArray; 

    private List<T[]> items = new ArrayList<T[]>();// valid 

    .......... 

} 

我相信你看到的錯誤不是從Eclipse發出的,可能來自Eclipse中配置的Android SDK。如果你在Eclipse中創建一個Java項目,這段代碼應該工作得很好。如果你在Eclipse的Android項目中使用它,你可能會遇到這個問題。從Android項目運行此代碼時出現此錯誤:

# guarantee(_name_index != 0 && _signature_index != 0) failed: bad constant pool index for fieldDescriptor 

不幸的是,您在Android項目中的聲音受限制。