1
public class Node {
  public Node right;
}

public class SpecialNode extends Node {
  public String specialLabel;
}

public class Testmain {
  public static void main(String[] args) {
  Node n1 = new Node();
  Node n2 = new Node();
  Node n3 = new Node();
  n1.right=n2;
  n2.right=n3;

  // some calculations --> now n2 has to become a SpecialNode, how ???
  }
} 

ノードを使用して単一のリンクされたリストを実現しています。ここでは、すべてのノードがその正しい隣人を知っています。ノード n1 -> ノード n2 -> ノード n3 というリストを作成しました。リストを作成すると、Node 型の要素だけが含まれます。ここで、specialLabel を提供するために Node n2 を SpecialNode にする必要があります。ダウンキャスト後、リストは Node n1-> SpecialNode n2-> Node n3 のようになります。これはどのように行うことができますか?

(n2 はその左側の隣人を認識していないことに注意してください。また、リストの作成後に n2 を特別なものにする必要があることに注意してください。そのため、スーパークラスのノードとして初期化した後、どのノードを使用するかを決定する前にいくつかの計算を行う必要があります。特別であること。)

4

2 に答える 2

3

になったことはないn2ので、SpecialNodeは言えません

n2既存のものをの新しいインスタンスに置き換えようとする方が良いと思いますSpecialNoden2少なくともそれがリストのどこにあるかを知っている場合は、それ自体を置き換えるか、それが失敗した場合は、少なくとも新しいインスタンスを提供するための良いアプローチになりますSpecialNode。このシナリオでは、n1手動で配線する必要があります。

SpecialNode sn = n2.toSpecialNode();
于 2012-09-12T08:24:26.987 に答える
0

これが私が最終的に解決した方法です。ダウンキャストが機能しないという答えに感謝します。私の解決策は@Andrewの動作に近いものです。継承Node自体には使用しませんが、含まれるデータには継承を使用します。それNodeはコンテナのように機能し、ワイヤを正しい隣人に保ちます。拡張SpecialNodei の代わりに、ノード参照用の属性を作成しますNodeDataNodeDataによって拡張されるNodeDataSpecialため、ノードは特別なコンテンツを運ぶことができます。

public class Node {
  public Node right;
  public NodeData;
}

public class NodeData {
}

public class SpecialNodeData extends NodeData {
  public String specialLabel;
}
于 2012-09-14T17:00:03.520 に答える