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

我正在使用 Node 实现一个单链表,其中每个节点都知道它的正确邻居。我创建了一个列表:节点 n1-> 节点 n2-> 节点 n3。创建列表后,它只包含 Node 类型的元素。现在我想告诉 Node n2 是一个 SpecialNode,以便提供一个 specialLabel。在向下转换之后,列表应该看起来像节点 n1-> SpecialNode n2-> 节点 n3。如何才能做到这一点?

(请注意,n2 不知道它的左邻居。请注意,我必须在创建列表后告诉 n2 是特殊的,因此在将其初始化为超类的节点之后,因为我需要在决定哪个节点之前进行一些计算要特别。)

4

2 回答 2

3

你不能说n2是一个SpecialNode,因为它从来没有

我认为你最好尝试n2用新的实例替换现有的 a SpecialNode。这将是一个很好的方法来n2替换自己(如果它知道它在列表中的位置),或者失败,至少给你一个新的 a 实例SpecialNode。在这种情况下,您必须n1手动将其连接起来。

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

这是我最终解决它的方法,感谢向下转换不起作用的答案,我的解决方案接近@Andrew的行为。我不为它本身使用继承,Node而是为它包含的数据使用继承。就像一个容器一样Node工作,我把我的电线放在正确的邻居身上。而不是扩展SpecialNode我为节点引用创建一个属性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 回答