试图用Java编写优先级队列,但得到;“线程中的异常”;“主要”;java.lang.ClassCastException“;
对于我的数据结构类,我正在尝试编写一个模拟洗车的程序,我想给高级车一个比使用优先级队列的普通车更高的优先级。我遇到的问题与Java无法将“Object”类型转换为“ArrayQueue”(一个简单的FIFO实现)有关。我做错了什么?我该如何修复它试图用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
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])