2015-05-14 78 views
0

編輯:注意帖子被標記爲重複;我通讀了其他類似的問題,但它確實沒有像我一樣處理同樣的問題。我正在使用一個保證類型爲Comparable的類,但我無法投射它。ClassCastException從Object []轉換爲Comparable []

我有以下類,它是一個接口隊列的實現。我確定HeapPriorityQueue對象的工作類型爲Comparable,因此E.compareTo(E other)方法可用。

我在我的主要方法中創建了一個HeapPriorityQueue的實例。當病人是實現可比

HeapPriorityQueue<Patient> queue = new HeapPriorityQueue<>(); 

在不過彙編一類,我得到一個異常拋出ClassCastException指向朝下面的代碼

public class HeapPriorityQueue<E extends Comparable<E>> implements Queue<E> 
{ 

    private final int DEFAULT_CAPACITY = 10; 

    private int size; 
    private E[] array; 

    public HeapPriorityQueue() 
    { 
     size = 0; 
     array = (E[]) new Object[DEFAULT_CAPACITY + 1]; 
    } 
} 

異常的最後一行:

線程「main」中的異常java.lang.ClassCastException:[Ljava.lang.Object;不能轉換爲[Ljava.lang.Comparable;

+0

是否有某種原因(例如老師這麼說),它需要是一個數組具體?還有其他的數據結構(例如'List ')可能更適合你... – dcsohl

+0

@dcsohl我的選擇有限。這是一個關於數據結構的課程,所以我想我的選擇或者是單鏈表或者堆結構的數組。 –

+0

即使你自己寫了,我也肯定會去某種'List'。正如你所發現的那樣,你不能執行'new E [size];'你不能從Object []轉換到'E []'(即使你可以,你也不想這樣做,因爲你的新的Object []'完全是'Object's而不是'E's!)。你最好的選擇可能是'ArrayList'。是否允許這是一個不同的問題。雖然我不得不問...如果它是一個**堆** PriorityQueue,你不應該設置一個堆而不是一個數組/列表? – dcsohl

回答

1

我正在使用保證類型爲Comparable的類,但我無法投射它。

new Object[DEFAULT_CAPACITY + 1];不保證什麼,而不是它是一個對象數組。對象數組無法安全地轉換爲Comparable數組。

你不得不使用這樣的:

Class<E> clazz; 
array = (E[]) Array.newInstance(clazz, size); 
相關問題