以下代码对于传递编译是合法的.为什么可以将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)
因为它也允许你指定自己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)
| 归档时间: |
|
| 查看次数: |
705 次 |
| 最近记录: |