2014-01-26 39 views
2

我想寫一個PriorityQueue,它必須泛化爲Comparable。下面是構造函數:創建通用數組時創建Java類異常

public class DavidiArrayPriorityQueue <E extends Comparable<E>> implements PriorityQueue<E> { 

    private E data[]; 
    private int numElements; 

    //creates an empty priority queue with 10 spaces by default 
    public DavidiArrayPriorityQueue(){ 

     data= (E[]) new Object[20]; 
     numElements=0; 
    } 

當我與

DavidiArrayPriorityQueue<Integer> test=new DavidiArrayPriorityQueue<Integer>(); 

它拋出[Ljava.lang.Object初始化;不能轉換爲[Ljava.lang.Comparable;

+3

確實; 「對象」不是「可比較的」。 –

+0

也許你應該使用List而不是數組? – Happy

+1

@OliCharlesworth:或者,更重要的是:'Object []'不是'Comparable []'。 – ruakh

回答

4

數組的元素類型實際上是數組的一部分,在運行時已知。所以當你編寫new Object[]時,你正在創建一個元素類型爲Object的數組,並且即使你的意圖是數組的元素都會有類型(比如說)Comparable,你仍然不能將它轉換爲Comparable[]

就你而言,你將它投射到E[]。由於刪除,演員陣容無法在運行時完全執行,因此將其降級爲Comparable[];所以,從技術上講,你可以通過編寫(E[]) new Comparable[]來誘使編譯器允許這樣做。但這是一個壞主意,因爲那麼你有一個E[]類型的數組表達式,其元素類型實際上不是E。你已經繞過了類型系統,這可能會在以後引起混淆錯誤。

最好是隻data是類型Object[](或者Comparable<?>[]),並進行必要的強制類型E。這會導致編譯器警告,因爲編譯器無法檢查這些強制轉換,但至少可以驗證代碼是否正確並正確地保留了類型系統(然後通過註釋來禁止警告) 。

+0

好的,謝謝你解決了這個問題:) – robotal

+2

只要數組沒有暴露在類之外,那麼將'new Comparable []'''''''''''改爲'E []'類型)。 –

+0

@PaulBellora,那種情況出現在['java.util']的'Collections'框架的類中(http://docs.oracle.com/javase/7/docs/api/java/util/package- summary.html) – Astrobleme