试图用Java编写优先级队列,但得到;“线程中的异常”;“主要”;java.lang.ClassCastException“;

试图用Java编写优先级队列,但得到;“线程中的异常”;“主要”;java.lang.ClassCastException“;,java,arrays,priority-queue,Java,Arrays,Priority Queue,对于我的数据结构类,我正在尝试编写一个模拟洗车的程序,我想给高级车一个比使用优先级队列的普通车更高的优先级。我遇到的问题与Java无法将“Object”类型转换为“ArrayQueue”(一个简单的FIFO实现)有关。我做错了什么?我该如何修复它 public class PriorityQueue<E> { private ArrayQueue<E>[] queues; private int highest=0; private int ma

对于我的数据结构类,我正在尝试编写一个模拟洗车的程序,我想给高级车一个比使用优先级队列的普通车更高的优先级。我遇到的问题与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;
    }
}
公共类优先队列
{
专用阵列队列[]队列;
私有整数最高=0;
私有int-manyItems=0;
公共优先队列(int h)
{
最高=h;
队列=(ArrayQueue[])新对象[最高+1];=0);
返回答案;
}
}
编辑

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

public PriorityQueue(int h)
{
    highest=h;
    queues = new ArrayQueue[highest+1];
    for(int i = 0; i <= highest; i++)
    {
        queues[i] = new ArrayQueue();
    }
}
public PriorityQueue(inth)
{
最高=h;
队列=新阵列队列[最高+1];

对于(int i=0;i而言,问题几乎与您所说的一模一样——您正在制作某种类型的
Object[]
并试图将其强制转换为
ArrayQueue[]
,而这些类型不兼容。您应该执行以下操作:

queues = new ArrayQueue[highest+1];

问题几乎与您所说的一模一样——您正在制作某种类型的
Object[]
,并试图将其强制转换为
ArrayQueue[]
,而这些类型不兼容。您应该执行以下操作:

queues = new ArrayQueue[highest+1];

一个对象是一个对象,并且(在大多数情况下)不是一个ArrayQueue。因此实际上,强制转换是不可能的

创建泛型数组也是一个问题,但在您的情况下,这应该是可行的:

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

教科书中对它的解释是不正确的,这本书需要一个新的修订周期;)Java中不允许使用建议的cast,这就像是一种尝试

String forEverUseless = (String) new Object(); // this will not give an empty String
                                               // but an ouch-that-hurts-Exception
更明显的是,您可以从不将类强制转换为其子类型之一(派生类)。这适用于所有类,包括数组和泛型类

编辑2

还有两项建议:

  • “add”方法应检查“priority”是否在有效的优先级范围内,否则add将引发异常(如:
    queue.add(entry,-1)
  • remove方法通常有一个参数-您可能希望使用应从队列中移除的元素调用它。(或者-如果您的意图是其他内容,我建议使用常见的队列操作名称pop、push和peek)

  • 一个对象是一个对象,并且(在大多数情况下)不是一个ArrayQueue。因此实际上,强制转换是不可能的

    创建泛型数组也是一个问题,但在您的情况下,这应该是可行的:

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

    教科书中对它的解释是不正确的,这本书需要一个新的修订周期;)Java中不允许使用建议的cast,这就像是一种尝试

    String forEverUseless = (String) new Object(); // this will not give an empty String
                                                   // but an ouch-that-hurts-Exception
    
    更明显的是,您可以从不将类强制转换为其子类型之一(派生类)。这适用于所有类,包括数组和泛型类

    编辑2

    还有两项建议:

  • “add”方法应检查“priority”是否在有效的优先级范围内,否则add将引发异常(如:
    queue.add(entry,-1)
  • remove方法通常有一个参数-您可能希望使用应从队列中移除的元素调用它。(或者-如果您的意图是其他内容,我建议使用常见的队列操作名称pop、push和peek)

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