我正在开发一个包含多个类的Java项目。一个类有main方法,一个类是最大堆数据结构,第三个类是要存储在最大堆中的对象的包装类。
在包装器类中,我定义了以下方法:
public void setHeapLoc(int l)
{
heapLoc = l;
}
在max heap类中,我有以下代码:
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;
}
在我在上面的方法中指出的那一行,我得到错误&#34;方法setHeapLoc(int)未定义为CompEq&#34;
类型同时,在主要方法中,如果我说:
CompEq temp = new CompEq(eq);
temp.setHeapLoc(1);
效果很好。
任何人都知道造成这种情况的原因是什么?
编辑:施法无济于事。将其更改为
Heap[current].setHeapLoc(current);
ADDS错误&#34;从CompEq到CompEq的不必要的演员。&#34;
答案 0 :(得分:0)
CompEq
是Heap
的子类setHeapLoc
和CompEq
定义了((CompEq)Heap[current]).setHeapLoc(current)
吗?
在这种情况下,您需要在调用函数之前将其强制转换。我希望你意识到这可能是某个地方糟糕设计的迹象
{{1}}
答案 1 :(得分:0)
由于方法setHeapLoc未定义为堆类型,因此将导致编译错误。因此,允许此赋值,因为Heap是CompEq的超类。为了使用类类型的引用来调用方法,必须在类层次结构中的该类或其上定义该方法。因此,Class Heap的对象无法调用Class CompEq中存在的方法,因为CompeqMethod方法不存在于Class Heap或其任何超类中。因此,通过将Heap对象引用转换为CompEq类对象引用,可以通过简单的向下转换来解决此问题,如程序中所做的那样。
((CompEq)Heap [current])。setHeapLoc(current);