0

複数のクラスを持つJavaプロジェクトに取り組んでいます。1 つのクラスにはメイン メソッドがあり、1 つのクラスは最大ヒープ データ構造であり、3 つ目は最大ヒープに格納されるオブジェクトのラッパー クラスです。

ラッパー クラスでは、次のメソッドを定義します。

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;
}

上記のメソッドで指摘した行で、「メソッド setHeapLoc(int) は CompEq 型に対して未定義です」というエラーが表示されます。

一方、メイン メソッドでは、次のように言います。

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

メソッド setHeapLoc は Heap Type に対して定義されていないため、以下を実行するとコンパイル エラーが発生します。Heap は CompEq のスーパークラスであるため、この割り当ては許可されます。クラス型の参照を使用してメソッドを呼び出すには、メソッドをクラス階層内のそのクラス以上で定義する必要があります。したがって、メソッド CompEqMethod はクラス ヒープまたはそのスーパークラスのいずれにも存在しないため、クラス ヒープのオブジェクトはクラス CompEq に存在するメソッドを呼び出すことはできません。したがって、この問題は、プログラムで行われたように、ヒープ オブジェクト参照を CompEq クラス オブジェクト参照にキャストすることにより、単純なダウンキャストによって解決できます。

((CompEq) ヒープ[現在]).setHeapLoc(現在);

于 2013-09-12T01:48:08.950 に答える