У меня есть приложение, которое требует, чтобы данные отображались на экране отчетов на веб-сайте с использованием 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>>>>
Это означает, что я должен сделать кучу грязных заклинаний, чтобы иметь возможность использовать возвращаемые объекты.
Есть ли способ избежать приведения или лучший способ кодирования моего дерева, чтобы мне не пришлось об этом беспокоиться?