[英]java tree node recursive generics
好的,所以我在樹中有一個節點,該節點可能有一個父節點(也是一個節點)和一些子節點(也就是節點)。
我想對Java泛型進行的操作是允許傳入將存儲子節點的List類型以及該節點將保存的數據。 因此,我編寫了以下類,編譯器似乎對此很滿意。
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時。
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;
返回的類型是列表,而不是我想要的ArrayList。
我想做的事可能嗎? 如果是這樣,也許有人可以告訴我我要去哪里,如果不是,最好的選擇是什么?
謝謝,里奇。
如您所見,遞歸泛型很快變得非常復雜。 我為您提供了兩種選擇。
1:刪除T並將子級聲明為List<Node<U>>
2:聲明節點為抽象節點,添加一個自引用,並定義一個具體的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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.