Java:使用java Generics创建树结构时出现问题

时间:2012-01-27 03:10:48

标签: java generics gwt tree

我有一个应用程序需要使用GWT在网站的报告屏幕上显示数据。此信息需要按树状结构分组,树的每一层都是不同类型的分组。

例如,数据可能需要按日期分组,然后按地区分组,然后按车辆分组。但是,在另一个类似的报告中,数据可能需要按照不同的顺序进行分组,比如车辆,日期,区域。

因此我使用泛型创建了一个树结构,每种类型的分组都是树节点的子类。下面是一个简单的代码版本。

public abstract class Node extends Composite implements Comparable<Node>
{
    //sorts the subtree of this node using the comparable interface
    //and by calling each of the child nodes sort methods
    public abstract sort();

    //when called will draw this node and its entire subtree to the UI
    //again by calling the child nodes draw method.
    protected abstract draw();
}

public abstract class ParentNode<E extends Node> extends Node
{
    private List<E> children = new ArrayList<E>();

    public void addChild( E child )
    {
        children.add( child );
    }

    public List<E> getChildren()
    {
        return children;
    }

    public void sort()
    {
        Collections.sort( children )

        for( E child : children )
        child.sort();
    }
}

public class DateGrouping<E> extends ParentNode<Node>
{
    public void draw()
    { ... }
}

public class Data extends Node
{...}

public class Report
{
    private RootNode<DateGrouping<RegionGrouping<VehicleGrouping<Data>>>> rootNode;

    public Report()
    {
        rootNode = new RootNode<DateGrouping<RegionGrouping<VehicleGrouping<Data>>>>();
    }
}

注意:其他组类型的定义方式与DateGrouping

相同

我对此实现的主要问题是调用

rootNode.getChildren() 
上例中的

返回

List<Node> object 

List<DateGrouping<RegionGrouping<VehicleGrouping<Data>>>> 

这意味着我必须做一堆脏转换才能使用返回的对象。

有没有办法避免进行投射,或者更好的编码树的方法,所以我不必担心它?

1 个答案:

答案 0 :(得分:0)

首先,您尚未向我们展示RootNode类实现。 但是如果你以与DateGrouping相同的方式实现它,那么行为是正确的。仔细查看如何在DateGrouping

实现界面
  

公共类DateGrouping&lt; E &gt;扩展ParentNode&lt; 节点&gt;

您不会将类型参数E传递给ParentNode。因此getChildren()将返回List<Node>,而非List<E>