Java: проблемы с созданием древовидной структуры с использованием Java Generics - PullRequest
2 голосов
/ 27 января 2012

У меня есть приложение, которое требует, чтобы данные отображались на экране отчетов на веб-сайте с использованием 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 голосов
/ 27 января 2012

Во-первых, вы не показали нам RootNode реализацию класса.Но если вы реализовали это так же, как DateGrouping, то поведение будет правильным.Посмотрите, как вы реализуете интерфейс на DateGrouping

открытый класс DateGrouping <<em> E > extends ParentNode <<em> Node >

Вы не передаете параметр типа E в ParentNode.Так что getChildren() вернет List<Node>, а не List<E>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...