Невозможно привести к классу . , , являются неназванным модулем загрузчика

#java

#java

Вопрос:

Я пытаюсь создать ADT очереди приоритетов с нуля, используя реализацию связанного списка. В очередь приоритетов мне нужно вставить задания, и задания должны выполняться в порядке приоритета. Приоритетный ADT, который я создал, был взят из моей книги по Java, и мой класс Job был создан мной. Я могу вставить все задания в очередь приоритетов, но когда я пытаюсь removeMin(), я получаю класс cannot cast… ошибка.

Это мой метод получения массива, помещения их в очередь и их удаления.

 public static void executeJobs(Job[] jobInputArray) {

    SortedPriorityQueue pq = new SortedPriorityQueue();
    
    for(int j = 0; j < jobInputArray.length; j  ) {
        pq.insert(jobInputArray[j].getFinalPriority(), jobInputArray[j]);
        jobInputArray[j].setEntryTime(j 1);
    }
    
    int cycles = 0;
    
    while(!pq.isEmpty()) {
        Job currentJob = (Job) pq.removeMin();
        System.out.println(currentJob.getJobName());
    }
}
  

Проблема возникает в моей строке: Job CurrentJob = (Job) pq.removeMin(); .

Это мой класс SortedPriorityQueue:

 public static class SortedPriorityQueue<K,V> extends AbstractPriorityQueue<K,V>{
private PositionalList<Entry<K,V>> list = new LinkedPositionalList<>();

public SortedPriorityQueue() { super(); }
public SortedPriorityQueue(Comparator<K> comp) {super(comp);}

public Entry<K,V> insert(K key, V value) throws IllegalArgumentException{
    checkKey(key);
    Entry<K,V> newest = new PQEntry<>(key,value);
    Position<Entry<K,V>> walk = list.last();
    
    while(walk != null amp;amp; compare(newest, walk.getElement()) < 0)
        walk = list.before(walk);
    if(walk == null)
        list.addFirst(newest);
    else
        list.addAfter(walk, newest);
    return newest;
}
public Entry<K,V> min(){
    if (list.isEmpty()) return null;
    return list.first().getElement();
}

public Entry<K,V> removeMin(){
    if(list.isEmpty()) return null;
    return list.remove(list.first());
}
public int size() {return list.size();}
  

}

Любая помощь приветствуется.. заранее спасибо!

Комментарии:

1. Пожалуйста, добавьте точное сообщение об ошибке к вашему вопросу.

2. Исключение в потоке «main» java.lang. ClassCastException: класс helloworld.helpers $AbstractPriorityQueue $PQEntry не может быть приведен к классу helloworld. Задание (helloworld.helpers$AbstractPriorityQueue $PQEntry и helloworld. Задание находится в неназванном модуле загрузчика ‘app’)

3. Какой тип возвращает removeMin? Для чего в вашем случае создаются экземпляры K и V?

Ответ №1:

removeMin возвращает an Entry<K,V> , а не a Job . Он не может быть приведен к Job . Реализация for Entry отсутствует, но я предполагаю, что у нее есть value() getValue() метод or:

 Job currentJob = (Job) pq.removeMin().getValue();
  

Комментарии:

1. святое дерьмо, я такой глупый… Я буквально играл с этим весь день. Я не знаю, почему он не щелкнул со мной

2. @FalseOccasion если вы создаете экземпляр своей очереди с new SortedPriorityQueue<KeyType, Job>() помощью, то вам вообще не нужно приводить. getValue() уже вернул бы правильный тип. Не используйте необработанные типы, если вы можете их избежать.

3. Попался! Быстрый вопрос, но есть ли способ перебрать очередь приоритетов, которую я создал для поиска значения с использованием расширенного цикла for?

4. @FalseOccasion: пусть ваш класс реализует Iterable интерфейс