【问题标题】:Trying to write priority queue in Java but getting "Exception in thread "main" java.lang.ClassCastException"尝试在 Java 中编写优先级队列,但得到“线程“主”java.lang.ClassCastException 中的异常”
【发布时间】:2010-05-31 06:37:00
【问题描述】:

对于我的数据结构类,我正在尝试编写一个模拟洗车的程序,并且我想使用优先级队列为高档汽车提供比普通汽车更高的优先级。我遇到的问题与 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();
    }
}

【问题讨论】:

    标签: java arrays priority-queue


    【解决方案1】:

    一个对象是一个对象并且(在大多数情况下)不是一个 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 方法通常有一个参数 - 您可能希望使用应从队列中删除的元素来调用它。 (或者 - 如果你的意图是别的,我建议使用常见的队列操作名称 poppushpeek

    【讨论】:

    • 我同意,但这就是我们教科书中的内容:“在这个实现中,构造函数使用以下语句为队列数组分配内存:queues = (ArrayQueue[]) new Object[highest+1]; 并且该数组具有最高+1 个元素(从 queues[0] 到 queues[highest])。”
    • 当你写的这本教科书不正确时,我几乎失去了所有希望。我不止一次有过这种​​感觉,但现在它被证实了。我做了你建议的改变并得到了一个全新的错误,所以我想它又回到了绘图板上。非常感谢您的宝贵时间。
    • 我通过将所有对 E 的引用替换为实际对象名称来解决新错误(不兼容的类型)。我失去了在其他应用程序中使用不同类型的相同类的能力,但这可以完成工作。
    【解决方案2】:

    问题几乎与您所说的完全一样——您正在制作Object[] 类型的东西并试图将其转换为ArrayQueue[],而这些类型不兼容。你应该这样做:

    queues = new ArrayQueue[highest+1];
    

    【讨论】:

    • 我同意,但这就是我们教科书中的内容:“在这个实现中,构造函数使用以下语句为队列数组分配内存:queues = (ArrayQueue[]) new Object[highest+1]; 并且该数组具有最高+1 个元素(从 queues[0] 到 queues[highest])。”
    猜你喜欢
    • 1970-01-01
    • 2017-06-16
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    相关资源
    最近更新 更多