1

以下代码通过编译是合法的。为什么可以将 PriorityQueue 定义为仅获取 instanceof Comparable 的元素?

...
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)
4

2 回答 2

5

因为它还允许您为Comparator不是Comparable. 这也会影响TreeSet,TreeMap和基本上所有其他已排序的集合。

如果您想在自己的代码中避免它,请首选工厂方法而不是构造函数,因为您可以在不同的工厂方法上指定不同的类型约束。例如,番石榴提供

<E extends Comparable> TreeSet<E> Sets.newTreeSet();
<E> TreeSet<E> Sets.newTreeSet(Comparator<? super E> comparator);
于 2012-05-17T15:21:31.777 回答
1

只要Comparable提供.Comparator

文档中:

优先级队列的元素根据其自然顺序或Comparator在队列构造时提供的顺序进行排序,具体取决于使用的构造函数。优先级队列不允许null元素。依赖于自然排序的优先级队列也不允许插入不可比较的对象(这样做可能会导致ClassCastException)。

于 2012-05-17T15:21:29.293 回答