2

我有一个名为 resourceItems 的列表,其中包含 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();
    }

我想扩展列表中的对象以包含一个名为 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

4 回答 4

1

假设ResourceItem实现equals并且hashCode正确,为什么不保留一组被选中的:

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

然后,您可以在选择时将add一个项目添加到集合中,在取消选择时将其添加到集合中,并在您需要知道它是否被选中时remove检查是否集合。contains

此解决方案与Michael Myers关于使用Map<ResourceItem, Boolean>.

于 2012-11-14T15:44:29.417 回答
0

是泛型限制令人困惑吗?尝试使用上界通配符,例如

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;
}

有关通配符通配符和子类型的更多信息。

于 2012-11-14T16:18:56.877 回答
0

但是使用您的代码段:

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

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

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

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));
    }
}
于 2012-11-14T15:53:21.137 回答
0

您应该在这里使用组合,而不是继承。根据您的描述,它听起来像是ResourceItem一个域对象,但在屏幕上,您应该将其包装起来

class ScreenResourceItem {
    ResourceItem item;
    boolean selected;
}

创建一个新列表ScreenResourceItem并将所有包装ResourceItem的 s 放入其中。

泛型和列表协方差在这里不相关。

于 2012-11-14T15:49:44.800 回答