为什么priorityQueue在编译时不需要类似的接口?

ROT*_*OGG 1 java

以下代码对于传递编译是合法的.为什么可以将PriorityQueue定义为仅采用可比较的实例元素?

...
PriorityQueue<Object> q = new PriorityQueue<Object>();
q.add(new Object());
...
Run Code Online (Sandbox Code Playgroud)

但它抛出了预期的例外:

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)
Run Code Online (Sandbox Code Playgroud)

Lou*_*man 5

因为它允许你指定自己Comparator为不属于元素类型Comparable.这也会影响TreeSet,TreeMap基本上所有其他已排序的集合.

如果您试图在自己的代码中避免使用它,那么首选工厂方法到构造函数,因为您可以在不同的工厂方法上指定不同的类型约束.例如,Guava 提供

<E extends Comparable> TreeSet<E> Sets.newTreeSet();
<E> TreeSet<E> Sets.newTreeSet(Comparator<? super E> comparator);
Run Code Online (Sandbox Code Playgroud)