我想使用DomainTree
由域特定节点组成的域特定树DomainNode
,但将所有通用函数保留在模板类Tree
和Node
. 首先,我从模板Tree<T>
和Node<T>
(其中 T 是节点数据的类型)开始。当时DomainTree
正在使用Node<T>
界面,这不是我想要的。它应该适用于DomainNode
对象。
为了解决这个问题,我将通用树的模板参数更改为Tree<N extends Node<?>>
(下面的实现)。现在我可以DomainNode
通过将树实例化为DomainTree<DomainNode>
.
不过,我在 (1) 处收到编译错误,因为getChildren()
返回了Node<T>
的列表N
,尽管我确定了N extends Node<?>
.
为什么这不起作用,我该如何设计它,以便DomainTree
可以与DomainNode
s 一起使用?
通用树
import java.util.ArrayList;
import java.util.List;
class Tree<N extends Node<?>> {
public N rootElement;
public List<N> toList() {
List<N> list = new ArrayList<N>();
walk(rootElement, list);
return list;
}
private void walk(N element, List<N> list) {
list.add(element);
List<N> children = element.getChildren(); // (1) Cannot convert from List<Node<T>> to List<T>
for (N data : children) {
walk(data, list);
}
}
}
class Node<T> {
public T data;
public List<Node<T>> children;
public List<Node<T>> getChildren() {
if (this.children == null) {
return new ArrayList<Node<T>>();
}
return this.children;
}
public void addChild(Node<T> child) {
if (children == null) {
children = new ArrayList<Node<T>>();
}
children.add(child);
}
}
问题特定树
class DomainTree extends Tree<DomainNode> {
public void build() {
for (DomainNode node : toList()) {
// process...
}
}
}
class DomainNode extends Node<String> {
}