2015-06-10 1 views
-2

Присвоение читает:
Дайте полную реализацию очереди приоритетов, используя массив обычных очередей. Для вашей обычной очереди, используйте версию ... на странице 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; 
    } 
} 
+3

Вы не можете бросить 'Object []' 'к очереди []', потому что 'Object []' не является 'Queue []'. Если вы хотите 'Queue []', вам нужно создать его. – azurefrog

+2

Почему вы думаете, что 'new Object []' может быть переведен в 'Queue []' ?? –

+1

Вы должны сильно рассмотреть использование 'List >', поскольку массивы и дженерики не очень хорошо смешиваются, но использование 'List's будет работать нормально. –

ответ

1

Вы можете 'случайным образом отбрасывает Object на другой тип. Если вы хотите Queue<T>[], вам нужно фактически построить один. Вы не можете создать массив с дженериков, так что вы будете иметь, чтобы сделать что-то вроде этого:

Queue<T>[] queue = (Queue<T> []) new ArrayDeque[10]; //or whatever concrete implementation you want.