簡體   English   中英

java樹節點遞歸泛型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM