2015-05-14 3 views
0

Редактировать: Заметил, что сообщение было помечено как дублирующее; Я прочитал другой, похожий вопрос, но он действительно не рассматривал ту же проблему, что и моя. Я работаю с классом, который гарантированно относится к типу Comparable, но я не могу его отличить.ClassCastException при литье из Object [] to Comparable []

У меня есть следующий класс, который представляет собой реализацию интерфейса Queue. Я уверен, что тип, с которым работает объект HeapPriorityQueue, реализует Comparable, так что доступен метод E.compareTo (E другой).

Я создаю экземпляр HeapPriorityQueue в моем основном методе. Где Пациентка класс, который реализует Сопоставимые

HeapPriorityQueue<Patient> queue = new HeapPriorityQueue<>(); 

При компиляции однако, я получаю ClassCastException исключение, которое указывает на последнюю строку в коде ниже

public class HeapPriorityQueue<E extends Comparable<E>> implements Queue<E> 
{ 

    private final int DEFAULT_CAPACITY = 10; 

    private int size; 
    private E[] array; 

    public HeapPriorityQueue() 
    { 
     size = 0; 
     array = (E[]) new Object[DEFAULT_CAPACITY + 1]; 
    } 
} 

за исключением:

Исключение в потоке «main» java.lang.ClassCastException: [Ljava.lang.Object; не может быть применено к [Ljava.lang.Comparable;

+0

Есть ли какая-то причина (например, так сказал учитель), что он должен быть массив конкретно? Существуют и другие структуры данных (например, «Список '), которые могут вам лучше подойти ... – dcsohl

+0

@dcsohl Я ограничен в своих вариантах. Это курс о структурах данных, поэтому я считаю, что мой выбор - это либо отдельные списки, либо массивы для структуры кучи. –

+0

Я бы определенно пошел на какой-то «Список» здесь, даже если вам нужно написать его самостоятельно. Как вы выяснили, вы не можете выполнить «новый E [размер];», и вы не можете отбрасывать из 'Object []' в 'E []' (который вы не хотели бы делать, даже если бы могли, так как ваш новый 'Object []' полон 'Object', а не 'E's!). Лучше всего, скорее всего, 'ArrayList'. Независимо от того, разрешено или нет, это другой вопрос. Хотя мне нужно спросить ... если это ** Heap ** PriorityQueue, разве вы не должны настраивать кучу, а не массив или список? – dcsohl

ответ

1

Я работаю с классом, который гарантированно иметь тип Сопоставимые, но я не могу бросить его.

new Object[DEFAULT_CAPACITY + 1]; не гарантирует ничего, кроме факта, что это массив объектов. Массив объектов нельзя безопасно отнести к массиву Comparable.

Вы должны были бы использовать что-то вроде:

Class<E> clazz; 
array = (E[]) Array.newInstance(clazz, size); 
Смежные вопросы