我有一个名为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;
}
非常感谢任何帮助。
答案 0 :(得分:1)
假设ResourceItem
正确实施equals
和hashCode
,为什么不保留一组选定的
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的更多信息。