我正在尝试为我的游戏制作一个简单的消息管理器。但是,我收到以下异常:
Exception in thread "main" Exception in thread "Thread-4" java.lang.ClassCastException: MessageManagement.Message cannot be cast to java.lang.Comparable
at java.util.concurrent.PriorityBlockingQueue.siftUpComparable(Unknown Source)
at java.util.concurrent.PriorityBlockingQueue.offer(Unknown Source)
at java.util.concurrent.PriorityBlockingQueue.add(Unknown Source)
at MessageManagement.MessageManager.EnqueueMessage(MessageManager.java:69)
初始化代码为:
MessageManager messageManager = new MessageManager();
messageManager.start();
//send bootstrap message
CJournal.Journal(Main.class, "Testing messanger: ending bootstrapping message to messagemanager");
Message boot_strap_message = new Message();
boot_strap_message.mflag = EEventMachine.EM_BOOTSTRAP;
messageManager.EnqueueMessage(boot_strap_message);
实际的消息管理器是:
public class MessageManager extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
while (true)
{
if (!messagesQueue.isEmpty())
{
//pull message from queue
Message message = messagesQueue.remove();
//dispatch messages according to their type
switch(message.mflag)
{
case EM_BOOTSTRAP:
CJournal.Journal(MessageManager.class, "Messaging system working properly.");
default:
CJournal.Journal(MessageManager.class, "Dispatch Message Trashed");
}
}
}
}
public static PriorityBlockingQueue<Message> messagesQueue = new PriorityBlockingQueue<Message>();
public static void EnqueueMessage(Message message)
{
//Error happens here
messagesQueue.add(message);
}
为什么会出现此错误,我需要采取什么措施来修复它?
最佳答案
根据 PriorityBlockingQueue's javadoc
A priority queue relying on natural ordering also does not permit insertion of non-comparable objects (doing so results in ClassCastException).
您的Message
类需要实现Comparable
class Message implements Comparable<Message> {
public int compareTo(Message m) {
int comparisonResult = //comparison logic.
return comparisonResult;
}
}
根据 Comparable#compareTo的 javadoc,compareTo
Set a negative integer, zero, or a positive integer if this message is less than, equal to, or greater than (respectively) the specified object.
您的另一个选择是提供 Comparator到 PriorityBlockingQueue
。
关于java - 使用 PriorityBlockingQueue 时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45021519/