Java Class 扩展时迭代自己的类型
Java Class that iterates its own type when extended
我想创建一个只有节点的自定义树数据结构,我可以在其中迭代它们。然后,我稍后可以扩展这个 class 并拥有非常基本的树
class Node{
Node parent;
ArrayList<Node> children;
public static void main(String[]args){
Node root = new Node();
for(Node child : root){
//do something
}
}
public Iterator<Node> iterator(){
// basic tree traversal iterator
}
}
我已经让它工作了,但是当我尝试扩展节点 class 时,问题就来了。使用扩展 class,继承的迭代器方法仍然是 returns Node 迭代器,这意味着我每次都必须转换。这是我 运行 遇到的问题的一个基本示例。让我们制作一棵包含整数的树:
class IntegerNode extends Node{
int value;
public static void main(String[]args){
IntegerNode root = new IntegerNode();
int total = 0;
for(IntegerNode child : root){ /* Compiler error, says that the
iterator returns Iterator<Node> and not Iterator<IntegerNode>*/
total+=child.value;
}
System.out.println(total);
}
}
有没有一种简单的方法可以解决此问题,而无需将 iterator() 方法从节点 class 复制到 IntegerNode class?
我认为以下方法可行(未经测试,因此不能 100% 确定):
class Node<T extends Node<T>> {
public Iterator<T> iterator(){
// basic tree traversal iterator
}
}
class IntegerNode extends Node<IntegerNode> {
public static void main(String[]args) {
IntegerNode root = new IntegerNode();
int total = 0;
for(IntegerNode child : root){
total += child.value;
}
System.out.println(total);
}
}
这基本上是准标准的扩展inheritable builder pattern。
我想创建一个只有节点的自定义树数据结构,我可以在其中迭代它们。然后,我稍后可以扩展这个 class 并拥有非常基本的树
class Node{
Node parent;
ArrayList<Node> children;
public static void main(String[]args){
Node root = new Node();
for(Node child : root){
//do something
}
}
public Iterator<Node> iterator(){
// basic tree traversal iterator
}
}
我已经让它工作了,但是当我尝试扩展节点 class 时,问题就来了。使用扩展 class,继承的迭代器方法仍然是 returns Node 迭代器,这意味着我每次都必须转换。这是我 运行 遇到的问题的一个基本示例。让我们制作一棵包含整数的树:
class IntegerNode extends Node{
int value;
public static void main(String[]args){
IntegerNode root = new IntegerNode();
int total = 0;
for(IntegerNode child : root){ /* Compiler error, says that the
iterator returns Iterator<Node> and not Iterator<IntegerNode>*/
total+=child.value;
}
System.out.println(total);
}
}
有没有一种简单的方法可以解决此问题,而无需将 iterator() 方法从节点 class 复制到 IntegerNode class?
我认为以下方法可行(未经测试,因此不能 100% 确定):
class Node<T extends Node<T>> {
public Iterator<T> iterator(){
// basic tree traversal iterator
}
}
class IntegerNode extends Node<IntegerNode> {
public static void main(String[]args) {
IntegerNode root = new IntegerNode();
int total = 0;
for(IntegerNode child : root){
total += child.value;
}
System.out.println(total);
}
}
这基本上是准标准的扩展inheritable builder pattern。