2011-09-11 33 views
3

我正在嘗試使用通用頂點和鄰接列表的Graph類,我在下面的代碼的第10行得到一個通用的數組創建錯誤。早些時候,我在第11行遇到了同樣的錯誤,但是通過投射解決了這個問題。但這個錯誤依然存在。代碼中有什麼錯誤?通用數組創建錯誤

import java.util.HashSet; 

public class Graph<T> { 
    private int numVertices; 
    private T[] vertex; 
    private HashSet<T>[] adjacent; 

    public Graph(int numVertices) { 
      this.numVertices = numVertices; 
      vertex = (T[]) new T[numVertices]; 
      adjacent = (HashSet<T>[]) new HashSet[numVertices]; 
    } 
} 
+3

@downvoter:爲什麼它被低估?我無法看到這個問題的問題! – home

回答

1

請勿混淆數組和集合。只使用集合:

private List<HashSet<T>> adjacent; 

然後,您可以選擇使用ArrayList作爲List實現。它同樣高效且更靈活。

+0

謝謝..現在我沒有得到任何錯誤只是未檢查/不安全的操作警告。 –

2

由於類型擦除,您不能在java中創建通用數組。

但是,您可以使用Array.newInstance(Class<T>, int)爲您創建一個。您必須將退還的Object投到T[]

/e1
這仍然留下了獲取Class<T>對象的問題。最好的(唯一我能想到的)做到這一點是在你的構造函數中有另一個參數,它需要類對象。

+0

http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html#FAQ202 – 2011-09-11 15:17:01

1

您不能創建未知類型的數組(因爲數組在運行時包含其組件類型)。但爲了您的目的,您只需創建一個可包含任何對象的Object[]

你有兩個選擇:

  1. 使用Object[]類型的變量。當您獲取元素並想將其用作T時,您可能必須投射到T
  2. 使用T[]vertex = (T[]) new Object[numVertices];)類型的變量。當你解決問題時,不需要投入T。但是,您必須確保不要將此引用傳遞給期望T[]的類之外的代碼,這將導致類別轉換異常。