Присвоение читает:
Дайте полную реализацию очереди приоритетов, используя массив обычных очередей. Для вашей обычной очереди, используйте версию ... на странице 402.Почему я получаю исключение класса?
Pg402 гласит:
public class PriorityQueue<E> { private ArrayQueue<E>[] queues; ...
В этом варианте осуществления конструктор выделяет память для массива очередей с утверждением:
queues = (ArrayQueue<E>[]) new Object[highest+1];
Однако:
Исключение в теме "main" java.lang.ClassCastException: [Ljava.lang.Object; не может быть применено к [Lpriorityqueue.Queue; в priorityqueue.PriorityQueue (PriorityQueue.java:17) в priorityqueue.PriorityQueue.main (PriorityQueue.java:67) Java. Результат: 1
Исключение на data = (Queue<T>[]) new Object[highPriority];
public class PriorityQueue<T>
{
private Queue<T>[] data;
private int size, hprior;
@SuppressWarnings("unchecked")
public PriorityQueue(int highPriority)
{
if(highPriority < 1)
throw new RuntimeException("Invalid priority number!");
data = (Queue<T>[]) new Object[highPriority]; //Error line 17
for(int i = 0; i < highPriority; i++)
{
data[i] = new Queue<>();
}
size = 0;
}
public void add(int priority, T element)
{
if(priority > data.length)
throw new RuntimeException("Invalid priority number!");
data[priority-1].enqueue(element);
size++;
}
public T remove()
{
if(empty())
throw new RuntimeException("Priority Queue is Empty!");
T element = null;
for(int i = data.length; i < 0; i--)
{
if(data[i].size()!=0)
element = (T) data[i].dequeue();
break;
}
return element;
}
public int size()
{
return size;
}
public boolean empty()
{
return size == 0;
}
public static void main(String[] args)
{
PriorityQueue<String> pq = new PriorityQueue<>(10); //Error at line 67
pq.add(1, "hi");
pq.add(2, "there!");
System.out.println(pq.remove());
}
}
class Queue<T>
{
private int front, rear, size;
public final static int DEFAULT_CAPACITY = 64;
private T[] queue;
public Queue(int capacity)
{
queue = (T[]) new Object[capacity];
size = 0;
front = 0;
rear = 0;
}
public Queue()
{
this(DEFAULT_CAPACITY);
}
public void enqueue(T element)
{
if(size() == queue.length)
throw new RuntimeException("Queue Full!");
queue[rear]= element;
rear = (rear +1) % queue.length;
size++;
}
public T dequeue()
{
if(empty())
throw new RuntimeException("Queue empty!");
T element = queue[front];
front = (front +1) % queue.length;
size--;
return element;
}
public int size()
{
return size;
}
public T front()
{
return queue[front];
}
public boolean empty()
{
return size == 0;
}
}
Вы не можете бросить 'Object []' 'к очереди []', потому что 'Object []' не является 'Queue []'. Если вы хотите 'Queue []', вам нужно создать его. – azurefrog
Почему вы думаете, что 'new Object []' может быть переведен в 'Queue []' ?? –
Вы должны сильно рассмотреть использование 'List>', поскольку массивы и дженерики не очень хорошо смешиваются, но использование 'List's будет работать нормально. –