2013-01-24 69 views
1

它是我在該站點上的第一個問題! 我已經做了我的研究,但沒有真正的作品...使用泛型的類創建陣列

所以,現在的問題是,它與Java的泛型數組創建辦:

class HashArray<K,V>{ 

    class HashNode<K,V>{ 
... 
} 


HashNode[] array; 

HashArray(int size){ 

ArrayList<HashNode> arrayM = new ArrayList<HashNode>(size); 

array = arrayM.toArray(array);       // pinned Line 

} 

} 

,並有一個NullPointerException在固定線。 如果我嘗試類似:

array = new HashNode[size]; 

我得到了Generics Array Creation error。我需要一個數組哈希節點,因爲我只允許與數組。

預先感謝您!

+0

'HashNode [] array;'未初始化。您將'array'作爲固定行中的參數。如果你將'null'傳遞給'toArray()',它會拋出NPE。 – jlordo

+0

有沒有辦法初始化它?鑑於你不能創建對象? – user2007447

+0

'HashNode []數組=新HashNode [0];' – jlordo

回答

3

這裏有幾個問題。首先,內部類(HashNode)對其聲明類的實例(HashArray)具有隱式引用。因此,它處於其聲明類的類型參數的範圍內。你不應該重新聲明的類型參數KVHashNode,因爲這是隱藏在外層標記:

class HashArray<K, V> { 

    class HashNode { 
     //K and V still have meaning in here 
    } 

    ... 
} 

要麼,讓HashNode一個靜態嵌套類來簡化事情自己:

class HashArray<K, V> { 

    static class HashNode<K, V> { 
     //no implicit reference to an outer HashArray 
    } 

    ... 
} 

進入數組創建:無法創建具體參數化類型的數組。請參閱Angelika Langer的泛型教程explanation on why。簡而言之,仿製藥和陣列就像油和水,你應該只使用收集品。

最好的解決辦法就是改用List<HashNode>。你已經開始用一個反正:

List<HashNode> nodeList = new ArrayList<HashNode>(size); 

或者,如果你讓HashNode靜態類:

List<HashNode<K, V>> nodeList = new ArrayList<HashNode<K, V>>(size); 

注意,在Java 7中,在RHS可以只是在這兩種情況下new ArrayList<>(size)


我的回答的完整性而已,如果你真的堅持要保持數組,你需要使用一個未經檢查的轉換:

@SuppressWarnings("unchecked") 
HashNode[] array = (HashNode[])new HashArray<?, ?>.HashNode[size]; 

或者,如果HashNode作出靜態:

@SuppressWarnings("unchecked") 
HashNode<K, V>[] array = (HashNode<K, V>[])new HashNode<?, ?>[size]; 

但是,這將是固有的不安全和不應該完成

+0

感謝您的全面回覆!非常感謝!問題是我只需要使用數組。我可以製作一個二叉樹或避免它們的東西,但經過研究後,我發現使這個項目整齊的最佳方式是一個哈希陣列。所以我需要實現泛型哈希(所有的對象都有hashCode())只有數組。這是交易。使用集合本來就是小菜一碟,我同意,但我不被允許。 – user2007447

+0

編輯完成後,您完成了! – user2007447

+0

@ user2007447好吧,但我不能誇大,這不是一個安全的解決方案。我鼓勵你閱讀鏈接的文章來理解爲什麼。由於這聽起來像是一項任務,我會留給你澄清如何處理你的教授。隨意問她/他甚至指向這個職位。 –