Я пытаюсь добавить методы для изменения приоритета элемента в двоичной куче процесса, которая является не общим классом, но является подклассом общего. Проблема возникает, когда я пытаюсь назначить элемент массива Comparable
, который отливается к родовому типу T
в переменную Process
. Я получаю java.lang.ClassCastException: [Ljava.lang.Comparable; cannot be cast to [Ltp07.ejercicio3.Proceso;
. Учтите, что меня попросили объявить массив как Comparable
и отдать его T
, чтобы обойти java, не позволяя объявить общий массив.Исключение Cast при использовании массива Comparable на Java
у меня есть:
public class MaxHeap<T extends Comparable<T>> implements PriorityQueue<T> {
@SuppressWarnings ("unchecked")
protected T[] data = (T[]) new Comparable[100];
protected int elementsAmount = 0;
//some class methods
}
Тогда это просто определенный класс Process
пользователь, который объявлен как public class Process implements Comparable<Process>
И:
public class ProcessQueue extends MaxHeap<Process> {
public void decreasePriority (int position, int decrement) {
Process temp;
if (position > 0 && position <= elementsAmount) {
temp = data[position]; //this is the line that generates the cast Exception
temp.setPriority(temp.getPID()- decrement);
data[position] = temp; //and I guess probably this line will generate another one if the execution reach this point
percolateDown(pos);
}
//some other methods
}
Так что мой вопрос как избежать этого исключения без изменений (если это возможно для академической цели, и я должен делать это таким образом)? а также, пытаясь выйти за рамки того, о чем меня спрашивали мои учителя, является хорошей практикой делать то, что я сделал во втором предложении класса MaxHeap, перейдя к Comparable, чтобы иметь общий массив? что если я попытаюсь реализовать универсальный класс структуры данных, объекты не ожидаются, даже если они будут сопоставимы, мне придется отдать его объекту, что звучит еще хуже, или есть другой способ решить эту проблему?
EDIT:
ошибка появляется во время выполнения, когда decreasePriority() `вызывается и достигает отмеченной линии
класс Процесс объявлен как: public class Process implements Comparable<Process>
и компилятор, в случае, если это связано с решение, не позволяет объявить его как public class Process implements Comparable
, жалуясь на то, что Comparable является сырым типом и ссылки на общий тип Comparable должен быть параметризован.
Копия вставили код и после изменения 'реализует PriorityQueue' в 'расширяет PriorityQueue ' работает отлично (с тем, что вы писали здесь) –
mastaH
я не могу сделать это с полным исходным кодом, PriorityQueue является интерфейсом, и я не думайте, что проблема слишком связана с этим интерфейсом. –