2012-05-17 76 views
1

以下代碼是合法傳遞編譯的。爲什麼可以將PriorityQueue定義爲只採用instanceof Comparable的元素?爲什麼priorityQueue在編譯時需要可比的接口?

... 
PriorityQueue<Object> q = new PriorityQueue<Object>(); 
q.add(new Object()); 
... 

但它引發的預期例外:

Exception in thread "main" java.lang.ClassCastException: java.lang.Object cannot be cast  to java.lang.Comparable 
    at java.util.PriorityQueue.siftUpComparable(PriorityQueue.java:595) 
    at java.util.PriorityQueue.siftUp(PriorityQueue.java:591) 
    at java.util.PriorityQueue.offer(PriorityQueue.java:291) 
    at java.util.PriorityQueue.add(PriorityQueue.java:268) 
    at ReentrantLockExample.main(ReentrantLockExample.java:12) 

回答

1

你允許存儲沒有實現Comparable只要你提供一個Comparator對象。

documentation

優先級隊列的元素根據它們的自然順序進行排序,或者通過在Comparator隊列構造的時候提供,這取決於所使用的構造方法。優先隊列不允許null元素。依賴於自然排序的優先級隊列也不允許插入不可比較的對象(這樣做可能導致ClassCastException)。

5

因爲它允許你指定你自己的Comparator元素類型不屬於Comparable。這也會影響TreeSet,TreeMap,以及基本上所有其他已排序的集合。

如果您嘗試在自己的代碼中避免使用它,請將工廠方法用於構造函數,因爲您可以在不同的工廠方法中指定不同的類型約束。例如,番石榴provides

<E extends Comparable> TreeSet<E> Sets.newTreeSet(); 
<E> TreeSet<E> Sets.newTreeSet(Comparator<? super E> comparator); 
相關問題