0

我正在开发一个包含多个类的 Java 项目。一类有main方法,一类是最大堆数据结构,第三类是要存放在最大堆中的对象的包装类。

在包装类中,我定义了以下方法:

public void setHeapLoc(int l)
    {
        heapLoc = l;
    }

在最大堆类中,我有以下代码:

public int insert(CompEq comp) {
  assert s < size : "No room";
  int current = size++;
  Heap[current] = comp;             
  while ((current != 0)  && (Heap[current].compareTo(Heap[parent(current)]) > 0)) {
    swap(Heap, current, parent(current));
    current = parent(current);
  }
  Heap[current].setHeapLoc(current); //<-------This line is the problem
  return curr;
}

在我在上述方法中指出的那一行,我收到错误“对于 CompEq 类型的方法 setHeapLoc(int) 未定义”

同时,在主要方法中,如果我说:

CompEq temp = new CompEq(eq);
temp.setHeapLoc(1);

它完美地工作。

任何人都知道可能导致这种情况的原因是什么?

编辑:铸造没有帮助。将其更改为

Heap[current].setHeapLoc(current);

添加错误“从 CompEq 到 CompEq 的不必要转换”。

4

2 回答 2

0

CompEq的子类Heap是否setHeapLoc定义在CompEq?

在这种情况下,您需要先转换它,然后才能调用该函数。我希望您意识到这可能表明某处设计不佳

((CompEq)Heap[current]).setHeapLoc(current)
于 2013-09-12T01:46:47.807 回答
0

由于未为 Heap Type Follow 定义方法 setHeapLoc 将导致编译错误。因此,允许此分配,因为 Heap 是 CompEq 的超类。为了使用类类型的引用来调用方法,该方法必须在类层次结构中的该类处或之上定义。因此,Class Heap 的对象不能调用 Class CompEq 中存在的方法,因为方法 CompEqMethod 不存在于 Class Heap 或其任何超类中。因此,这个问题可以通过简单的向下转换来解决,方法是将 Heap 对象引用转换为 CompEq 类对象引用,就像在程序中所做的那样。

((CompEq) 堆[当前]).setHeapLoc(当前);

于 2013-09-12T01:48:08.950 回答