无法找到符号/无法将对象转换为可比较的使用ArrayList中的泛型

无法找到符号/无法将对象转换为可比较的使用ArrayList中的泛型

问题描述:

在此程序中,我使用Java中的Array列表创建堆优先级队列。 我会尽量保持代码不变,以帮助更轻松地解决问题。无法找到符号/无法将对象转换为可比较的使用ArrayList中的泛型

本质上,我已经为heapAPI定义了一个接口并在Heap类中实现它。堆构造函数应该通过定义对象的数组列表来构造堆对象。在这里,我想传递PCB类的对象(作业进入优先级队列)。但是,当我传递这些对象时,我无法通过数组列表访问它们。

下面的附件是HeapAPI,堆类和PCB类的代码。

HeapAPI.java

public interface HeapAPI<E extends Comparable<E>> 
{ 
    boolean isEmpty(); 
    void insert(E item); 
    E remove() throws HeapException; 
    E peek() throws HeapException; 
    int size(); 
} 

Heap.java

public class Heap<E extends Comparable<E>> implements HeapAPI<E> 
{ 
    private ArrayList<E> tree; 

    public Heap() 
    { 
      tree = new ArrayList<>(); 
    } 

// don't believe the rest of the class is necessary to show 
} 

PCB.java

public class PCB implements Comparable<PCB> 
{ 
    private int priority; 

    // various private variables 

    public PCB() 
    { 
     priority = 19; 
     // instantiated variables 
    } 

    // don't believe the rest of the code is necessary 
    // the one specific function of PCB I use follows 

    public int getPriority() 
    { 
      return priority; 
    } 
} 

我曾尝试以下方法主要通过该ArrayList调用PCB对象的功能将PCB对象插入Heap对象的数组列表后。

Main.java

public class Main 
{ 
    public static void main(String[] args) throws HeapException 
    { 
      Heap temp = new Heap(); 
      PCB block = new PCB(); 
      PCB block1 = new PCB(); 
      PCB block2 = new PCB(); 

      temp.insert(block); 
      temp.insert(block1); 
      temp.insert(block2); 

      block.getPriority(); 

      // does not work 
      int num = temp.peek().getPriority(); 
      //does not work 
      num = temp.get(0).getPriority(); 
} 

我得到该程序无法找到符号的错误:方法getPriority()。

[另外,import java.util.ArrayList;被称为在每个文件中]

我一直在尝试学习和应用泛型的热门分钟,但我现在只是卡住了。

如果我不清楚任何事情,我可以轻松添加更多代码或澄清问题。

任何帮助表示赞赏。

谢谢!

+0

请注意,除非PCB被认为具有“自然”排序(我不认为他们这样做,如果PCB意味着“印刷电路板”)。相反,'PCB'不应该实现'Comparable ',并且'HeapAPI'不需要被限制为'Comparable'类型;而是可以向'HeapAPI'的实现者的构造函数提供'Comparator ',它允许它对元素进行排序。 [很多关于此的问题/回答](https://*.com/questions/4108604/java-comparable-vs-comparator)。 –

这里的问题:

Heap temp = new Heap(); 

你有一个通用的Heap类,但在这里,你都没有它的仿制药创建它。这是Raw Types的一个例子。

喜欢的东西:

Heap<PCB> temp = new Heap<>(); 

应该工作。

+0

完美无瑕地工作。也完全感觉。感谢您指出了这一点。 – boppa

你堆声明改为

Heap<PCB> temp = new Heap<>(); 

现在你的编译器知道堆包含PCB对象等它期待媲美返回不具有getPriority()方法。

+0

再次,工作完美无瑕。也完全感觉。感谢您指出这一点...... – boppa

+0

@boppa注意,您将被警告:无论是通过命令行的javac,还是通过您的IDE。注意你的编译器,它可以帮助你! –