我有一个应用程序需要使用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>>>>
这意味着我必须做一堆脏转换才能使用返回的对象。
有没有办法避免进行投射,或者更好的编码树的方法,所以我不必担心它?
答案 0 :(得分:0)
首先,您尚未向我们展示RootNode
类实现。
但是如果你以与DateGrouping
相同的方式实现它,那么行为是正确的。仔细查看如何在DateGrouping
公共类DateGrouping&lt; E &gt;扩展ParentNode&lt; 节点&gt;
您不会将类型参数E传递给ParentNode
。因此getChildren()
将返回List<Node>
,而非List<E>