具有相同超类的子对象列表的列表

时间:2011-05-17 09:59:40

标签: java list listview inheritance wicket

我正在尝试设计一个模型,其中我有一个具有相同超类的子对象列表。该模型将是ListView的模型。超级课程是:

public class Element implements Serializable {

    private static final long serialVersionUID = 10121L;

    private String value;

    public Element(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "Element [value=" + value + "]";
    }   
}

其中一个子类是:

public class DateElement extends Element {

    private static final long serialVersionUID = 10122L;

    private DateTime date;

    public DateElement(String value, DateTime date) {
        super(value);
        this.date = date;
    }

    public DateTime getDate() {
        return date;
    }

    public void setDate(DateTime date) {
        this.date = date;
    }

    @Override
    public String toString() {
        return "DateElement [date=" + date + ", value=" + getValue() + "]";
    }   
}

我将List of List实例化为:

this.userMonitorMap = new ArrayList<List<? extends Element>>(0);

在userMonitorMap中添加DateElement列表:

List<DateElement> dateElements = getDateElements();
userMonitorMap.add(dateElements);

这部分我没有遇到麻烦。但是ListView的数量有问题,代码片段是:

        ListView row = new ListView("row", userMonitorMap) {

            @Override
            protected void populateItem(ListItem rowItem) {
                List<? extends Element> columnMap = (List<? extends Element>) rowItem;
                ListView column = new ListView("column", columnMap) {

                    @Override
                    protected void populateItem(ListItem columnItem) {
                        Element element = (Element) columnItem; //The compile time error is here
                    }
                };
                rowItem.add(column);
            }
        };

我在代码中评论了这个问题。我怎样才能做到这一点?我需要做哪些改变?

eclipse IDE red标记了该行,错误消息为:无法从ListItem强制转换为元素

谢谢和问候。

1 个答案:

答案 0 :(得分:2)

ListItem不是列表本身的对象,它包含一个包含对象的模型。你应该使用:

Model<Element> elementModel = columnItem.getModel();

Element element = columnItem.getModelObject();

看看这些examples

您的代码应为:

ListView row = new ListView(“row”,userMonitorMap){

        @Override
        protected void populateItem(ListItem rowItem) {
            List<? extends Element> columnMap = rowItem.getModelObject();
            ListView column = new ListView("column", columnMap) {

                @Override
                protected void populateItem(ListItem columnItem) {
                    Element element = columnItem.getModelObject();
                }
            };
            rowItem.add(column);
        }
    };