gpt4 book ai didi

java - 从通用树到领域特定树

转载 作者:太空宇宙 更新时间:2023-11-04 14:10:20 26 4
gpt4 key购买 nike

我想使用域特定树 DomainTree由域特定节点 DomainNode 组成,但将所有通用函数保留在模板类中TreeNode 。首先,我从模板 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 一起使用是吗?

通用树

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> {

}

最佳答案

目前代码的问题在于,对于给定的 Node<T> ,编译器无法知道 List 的类型从 toList() 返回是相同 Node<T>作为类本身。

您需要的是一个自引用泛型类型:

class Node<T, N extends Node<T, N>> {

public T data;
public List<N> children;

public List<N> getChildren() {
return children == null ? Collections.<N>emptyList() : children;
}

public void addChild(N child) {
if (children == null) {
children = new ArrayList<N>();
}
children.add(child);
}
}

现在从 toList() 返回的类型与类型本身相同类型。

然后DomainNode变成:

class DomainNode extends Node<String, DomainNode> {
//
}

以及 Tree 的签名稍微改变一下就变成:

class Tree<N extends Node<?, N>> {

您的使用示例现在可以编译:

class DomainTree extends Tree<DomainNode> {
public void build() {
for (DomainNode node : toList()) {
// process...
}
}
}
<小时/>

我还增加了一些其他效率。

关于java - 从通用树到领域特定树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28409135/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com