2015-11-20 3 views
0

Я пытаюсь добавить методы для изменения приоритета элемента в двоичной куче процесса, которая является не общим классом, но является подклассом общего. Проблема возникает, когда я пытаюсь назначить элемент массива 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 должен быть параметризован.

+0

Копия вставили код и после изменения 'реализует PriorityQueue ' в 'расширяет PriorityQueue ' работает отлично (с тем, что вы писали здесь) – mastaH

+0

я не могу сделать это с полным исходным кодом, PriorityQueue является интерфейсом, и я не думайте, что проблема слишком связана с этим интерфейсом. –

ответ

1

фактический тип выполнения массива является Comparable[], который не является присваиваемые T[] (если T не точно Comparable), поэтому литой теоретически не правильно. Эта «ложь» не вызывает никаких проблем, поскольку data используется только внутри MaxHeap, где T стирается до Comparable.

Однако, если вы подвергаете data как тип T[] к внешней сферы, где T, как ожидается, будет определенный тип, то это вызовет исключения актеров. В этом случае переменная protecteddata подвергается подклассу ProcessQueue, который определяет конкретный тип (Process) для T. Поэтому ожидается, что data будет Process[], но это не так. Это вызывает исключение.

0

Ваша ошибка в том, что один элемент в data не является Process.

Это означает, что элементы в массиве Comparable не являются Processes. Вы не показали нам объявление класса и не создавали процессы. Это кажется важным.

Вам нужны ваши процессы должны быть объявлены

class Process extends ... implements Comparable { 
} 

и вы должны инициализировать массив с новыми процессами где-то, например,

for(int i=0;i<100;i++) data[i]=new Process(); 
+0

Я просто добавил объявление класса «Process» в исходное сообщение, класс «Process» - довольно простой класс с несколькими геттерами и сеттерами, единственная замечательная вещь в том, что он расширяет «Comparable», поэтому он имеет 'compareTo()', его инициализация довольно тривиальна. Что касается инициализации массива, то мгновение элементов массива корректно выполняется через 'addElement()' в классе PriorityQueue', который в основном разрешает его через суперкласс 'MaxHeap' –

Смежные вопросы