如何扩展List中包含的对象?

时间:2012-11-14 15:26:32

标签: java generics inheritance

我有一个名为resourceItems的List,它包含ResourceItem对象。

    public class ResourceItem {
        private Long id;
        private String name;
        public ResourceItem(Long id, String name) {
            this.id = id;
            this.name = name;
        }
        // getters and setters...
    }

    public class SomeClass {
        private List<ResourceItem>  resourceItems = FindAllResourcesWebSerbice();
    }

我想扩展List中的对象以包含一个名为selected的布尔字段。

我尝试了几种扩展ResourceItem的类(见下文),包括使用泛型的选项,但是没有成功。我希望能够使用泛型来重复使用。

    public class ExtendedResourceItem extends ResourceItem {
        private boolean selected = false;
        public ExtendedResourceItem() {
        }

        public boolean isSelected() {
            return selected;
        }

        public void setSelected(boolean selected) {
            this.selected = selected;
        }
    }

    public class SomeClass {
        private List<ResourceItem>  resourceItems = FindAllResourcesWebSerbice();
        private List<ExtendedResourceItem> extendedResourceItem = resourceItems;
    }

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

假设ResourceItem正确实施equalshashCode,为什么不保留一组选定的

Set<ResourceItem> selectedResourceItems = new HashSet<ResourceItem>();

然后,您可以add选择一个项目,remove取消选中该项目,然后检查是否设置contains一,当你需要知道它是否被选中时。

此解决方案与使用Map<ResourceItem, Boolean>的<{3}}非常相似。

答案 1 :(得分:0)

你应该使用组合,而不是继承。从您的描述中可以看出ResourceItem是一个域对象,但在屏幕上,您应该将其包装

class ScreenResourceItem {
    ResourceItem item;
    boolean selected;
}

创建ScreenResourceItem的新列表,并将所有已包装的ResourceItem放入其中。

泛型和列表协方差与此无关。

答案 2 :(得分:0)

但是使用你的代码片段:

private List<ResourceItem> resourceItems = ... \\ some assignment;
private List<ExtendedResourceItem> extendedResourceItems = resourceItems;

绝对错误。由于不保证任何ResourceItem也是ExtendedResourceItem。 (resourceItems列表可以包含ResourceItem但不是ExtendedResourceItem的对象。)

我没有看到您想要达到的目标,但是如果您想将resourceItems转换为具有selected属性的resourceItem列表,那么这个概念如何:

public class ExtendedResourceItem {
    private ResourceItem item = null;
    private boolean selected = false;

    public ExtendedResourceItem(ResourceItem item, boolean selected) {
        this.item = item;
        this.selected = selected;
    }

    // ... getters and setters
}

public class SomeClass {
    private List<ResourceItem> resourceItems = FindAllResourcesWebSerbice();

    private List<ExtendedResourceItem> extendedResourceItems = new ArrayList<ExtendedResourceItem>();
    for (ResourceItem item: resourceItems) {
        extendedResourceItems.add(new ExtendedResourceItem(item, false));
    }
}

答案 3 :(得分:0)

仿制药限制令人困惑吗?尝试使用Upper Bounded Wildcards,例如

public class SomeClass {
    private List<ExtendedResourceItem> extendedResourceItems = FindAllResourcesWebSerbice();
    private List<? extends ResourceItem> resourceItems = extendedResourceItems;
}

或者:

public class SomeClass {
    private List<? extends ExtendedResourceItem> extendedResourceItems = FindAllResourcesWebSerbice();
    private List<? extends ResourceItem> resourceItems = extendedResourceItems;
}

有关通配符Wildcards and Subtyping的更多信息。