当我尝试在我的Java类中向PriorityQueue添加多个元素时,抛出以下异常:
java.lang.ClassCastException
添加以下消息“事件无法转换为java.lang.Comparable
当我尝试将两个Event对象添加到优先级队列时,我得到了这个表达式。这是我如何初始化优先级队列等。也许我的构造中有错误,因为这是我第一次使用它:
//the instance field
private PriorityQueue<Event> queue;
//Then in the constructor
queue = new PriorityQueue<Event>();
我只是在main方法中测试它,但是当我得到上述错误时:
public static void main(String[] args) {
SimEngine engine = new SimEngine();
Event event1 = new Event();
Event event2 = new Event();
engine.getQueue().offer(event1);
engine.getQueue().offer(event2);
System.out.println("Queue size" + engine.queue.size());
}
注意:我尝试在尝试添加到队列时调用add和offer。我得到了同样的错误。
以上所有代码都在我的SimEngine类中。我知道队列需要知道如何订购这些元素,但我想如果你没有指定任何优先级那么它会自然地对它们进行排序?有人可以告诉我,我在做错了,谢谢。
答案 0 :(得分:4)
Event
需要实施the Comparable<Event>
interface。这意味着您需要编写compareTo(Event)
方法。没有&#34;自然&#34;订购未实现Comparable
的对象。
另一种选择是在构造它时将Comparator<Event>
实现传递给队列,以告诉队列如何比较Event
个实例。
答案 1 :(得分:3)
PriorityQueue是一个已排序的集合。因此,添加到它们的元素必须相互比较。
他们必须实现Comparable(并且队列使用compareTo
方法隐含的自然顺序对它们进行排序),或者在创建Queue本身时必须提供Comparator(队列将使用此比较器进行比较)对象和排序)。
如果您不执行其中任何一项操作,则队列无法确定第一个元素的优先级是否高于第二个元素。