java树节点递归泛型

java树节点递归泛型,java,generics,recursion,tree,Java,Generics,Recursion,Tree,我在树中有一个节点,它可能有一个父节点(也是一个节点)和一些子节点(也是节点) 我想对Java的泛型做的是允许传递子节点将存储在其中的列表类型以及节点将保存的数据。因此,我编写了下面的类,编译器似乎对此很满意 public class Node<T extends List<Node<T, U>>, U> { public Node<T, U> parent; public T children; public U data

我在树中有一个节点,它可能有一个父节点(也是一个节点)和一些子节点(也是节点)

我想对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();
    }
}

返回的类型是列表,而不是我想要的ArrayList

我想做的事可能吗?如果是这样的话,也许有人能告诉我哪里出了问题,或者如果不是,最好的选择是什么


谢谢,里奇。

正如您所发现的,递归泛型很快就会变得非常复杂。我给你两个选择

1:删除T并将子项声明为
列表

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);
    }

}
抽象类节点
{
公共节点父节点;
公共教育和儿童教育;
公共数据;
私有类tClass;
公共节点(类tClass)抛出InstanceionException、IllegalAccessException
{
this.tClass=tClass;
this.children=this.tClass.newInstance();
}
{
Node Node=新的ALNode();
ALNode node2=新的ALNode();
}
}
类ALNode扩展了Node{
public ALNode()抛出实例化异常,
非法访问例外{
超级((类)ArrayList.Class);
}
}

“返回的类型是列表,而不是我想要的ArrayList”。。。为什么这是一个问题
children
被声明为一个
List
,而不是
ArrayList
。除了Jim:and
ArrayList
是一个
List
之外,不管列表实际上是如何实现的,只要知道它是一个列表就足够了。不要将列表的类型设置为泛型,使用
List
就可以了。
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;
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);
    }

}