【发布时间】:2011-07-28 19:06:14
【问题描述】:
好的,所以我在树中有一个节点,它可能有一个父节点(也是一个节点)和一些子节点(也是节点)。
我想用 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 上的绑定不匹配,编译器会报错。我尝试通过以下尝试来修复它:
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。
我正在尝试做的事情可能吗?如果是这样,也许有人可以告诉我哪里出错了,或者如果不是最好的选择是什么?
谢谢,里奇。
【问题讨论】:
-
"返回的类型是一个 List,而不是我想要的 ArrayList"... 为什么这是个问题?
children被声明为List,而不是ArrayList。 -
除了Jim: 和
ArrayList是List之外,List 实际是如何实现的并不重要,知道它是一个List 就足够了 -
不要将列表的类型设为泛型,使用
List<E>即可。
标签: java generics recursion tree