将不可比较的对象添加到 PriorityQueue

Adding a non-comparable object to a PriorityQueue

考虑以下代码:

import java.util.PriorityQueue;

public class Test {

    public static void main(String argv[]) {
        PriorityQueue<A> queue = new PriorityQueue<>();
        System.out.println("Size of queue is " + queue.size()); // prints 0
        try {
            queue.add(new A());
        } catch (ClassCastException ignored) { }
        System.out.println("Size of queue is " + queue.size()); // prints 1
    }

} 
class A { } // non-comparable object

在此代码中,一个明确不可比较的对象被添加到 PriorityQueue。按照 PriorityQueue.add Javadoc 的预期,此代码抛出 ClassCastException 因为对象不可比较。

但是,尽管抛出了异常,但队列的大小似乎仍然增加了。

我本来希望两个打印语句都输出 0,但第二个实际上输出 1,就好像一个对象已添加到队列中一样。

这里发生了什么?

我不希望在该行上抛出异常。仔细阅读文档:可能会抛出异常

if the specified element cannot be compared with elements currently in this priority queue according to the priority queue's ordering

由于当前优先级队列中没有其他元素,我不一定会抛出异常。

您声称 add() 抛出异常,但您的测试无法证明该声明。如果实际上 抛出,那么您应该期望队列的大小保持为 0。但是,您不应期望抛出异常。

PriorityQueue.add() 的文档说:

ClassCastException - if the specified element cannot be compared with elements currently in this priority queue according to the priority queue's ordering

如果没有其他元素,则不会出现这种情况。但是,如果您尝试添加另一个元素,则应抛出异常,并且队列的大小应保持为 1。

这是文档中的实际声明:

A priority queue relying on natural ordering also does not permit insertion of non-comparable objects (doing so may result in ClassCastException).

对队列做一些不允许的事情意味着不能保证队列在完成后将如何表现。作为额外确认,请仔细查看此部分:"doing so may result in a ClassCastException." 换句话说,甚至不需要实现抛出异常。