尝试在Java中编写优先级队列,但获得“线程中的异常”主“java.lang.ClassCastException”

时间:2010-05-31 06:37:01

标签: java arrays priority-queue

对于我的数据结构类,我正在尝试编写一个模拟洗车的程序,并且我想让花式汽车比使用优先级队列的常规汽车更高优先级。我遇到的问题与Java有关,无法将“Object”类型转换为“ArrayQueue”(简单的FIFO实现)。我做错了什么,我该如何解决?

public class PriorityQueue<E>
{

    private ArrayQueue<E>[] queues;
    private int highest=0;
    private int manyItems=0;


    public PriorityQueue(int h)
    {
        highest=h;
        queues = (ArrayQueue<E>[]) new Object[highest+1];   <----problem is here
    }


    public void add(E item, int priority)
    {
        queues[priority].add(item);
        manyItems++;
    }


    public boolean isEmpty( )
    {
        return (manyItems == 0);
    }


    public E remove()
    {
        E answer=null;
        int counter=0;

        do
        {
            if(!queues[highest-counter].isEmpty())
            {
                answer = queues[highest-counter].remove();
                counter=highest+1;
            }
            else
                counter++;
        }while(highest-counter>=0);

        return answer;
    }
}

修改

谢谢你们对这个问题的快速回答。我按照你的建议和另外一段代码解决了这个问题:

public PriorityQueue(int h)
{
    highest=h;
    queues = new ArrayQueue[highest+1];
    for(int i = 0; i <= highest; i++)
    {
        queues[i] = new ArrayQueue();
    }
}

2 个答案:

答案 0 :(得分:4)

对象是一个对象,并且(在大多数情况下)不是ArrayQueue。所以演员阵容确实不可能。

创建通用数组也是一个问题,但在你的情况下,这应该有效:

public PriorityQueue(int h)
{
    highest=h;
    queues = new ArrayQueue[highest+1];   // Gives an ignorable warning
}

修改

教科书中解释的方式不正确,本书需要一个新的修订周期;)Java中不允许使用建议的强制转换,这就像尝试一样

String forEverUseless = (String) new Object(); // this will not give an empty String
                                               // but an ouch-that-hurts-Exception

哪个更明显。您可以从不将类强制转换为其子类型(派生类)之一。这适用于所有类,包括数组和泛型类。

编辑2

还有两个建议:

  1. 'add'方法应检查'priority'是否在优先级的有效范围内,否则add将抛出异常(如:queue.add(entry, -1)
  2. remove方法通常有一个参数 - 您可能希望使用应从队列中删除的元素来调用它。 (或者 - 如果你的意图是别的,我建议使用公共队列操作名称​​ pop push peek

答案 1 :(得分:1)

问题几乎就是你所说的 - 你正在制作类型为Object[]的东西,并尝试将其转换为ArrayQueue[],而这些不是兼容的类型。你应该这样做:

queues = new ArrayQueue[highest+1];