作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好的,所以我在树中有一个节点,它可能有一个父节点(也是一个节点)和一些子节点(也是节点)。
我想用 Java 的泛型做的是允许传入将存储子节点的列表类型以及节点将保存的数据。所以我编写了编译器似乎很满意的以下类。
public class Node<T extends List<Node<T, U>>, U>
{
public Node<T, U> parent;
public T children;
public U data;
private Class<T> tClass;
public Node(Class<T> tClass) throws InstantiationException, IllegalAccessException
{
this.tClass = tClass;
this.children = this.tClass.newInstance();
}
}
问题出在我尝试初始化节点时。
Node<ArrayList, NodeData> node = new Node(ArrayList.class);
编译器因为 ArrayList 上的 Bound 不匹配而报错。我尝试通过以下尝试修复它:
Node<ArrayList<Node>, NodeData> node = new Node(ArrayList.class);
Node<ArrayList<Node<ArrayList, NodeData>>, NodeData> node = new Node(ArrayList.class);
Node<ArrayList<Node<ArrayList<Node>, NodeData>>, NodeData> node = new Node(ArrayList.class);
Node<ArrayList<Node<ArrayList<Node<ArrayList, NodeData>, NodeData>>, NodeData> node = new Node(ArrayList.class);
如你所见,这将永远持续下去,我知道我可以用
public class Node<T extends List<Node>, U>
{
public Node<T, U> parent;
public T children;
public U data;
private Class<T> tClass;
public Node(Class<T> tClass) throws InstantiationException, IllegalAccessException
{
this.tClass = tClass;
this.children = this.tClass.newInstance();
}
}
它允许我使用:
Node<ArrayList<Node>, NodeData> node = new Node(ArrayList.class);
但是当我做类似的事情时:
node.children.get(0).children;
返回的类型是一个 List,而不是我想要的 ArrayList。
我想做的事情可行吗?如果是这样,也许有人可以告诉我哪里出了问题,或者如果不是,最好的选择是什么?
谢谢,里奇。
最佳答案
正如您所发现的,递归泛型很快就会变得非常复杂。我为您看到了两个选项。
1: 删除 T 并让 child 被声明为 List<Node<U>>
2:将Node声明为抽象的,添加一个自引用,并定义一个具体的ArrayList节点引用。
abstract class Node<N extends Node<N, T, U>, T extends List<N>, U>
{
public Node<N, T, U> parent;
public T children;
public U data;
private Class<T> tClass;
public Node(Class<T> tClass) throws InstantiationException, IllegalAccessException
{
this.tClass = tClass;
this.children = this.tClass.newInstance();
}
{
Node<ALNode<Integer>, ArrayList<ALNode<Integer>>, Integer> node = new ALNode<Integer>();
ALNode<Integer> node2 = new ALNode<Integer>();
}
}
class ALNode<U> extends Node<ALNode<U>, ArrayList<ALNode<U>>, U> {
public ALNode() throws InstantiationException,
IllegalAccessException {
super((Class) ArrayList.class);
}
}
关于java树节点递归泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6864315/
我是一名优秀的程序员,十分优秀!