Java 集合协方差问题
假设我们有一个包含此类类的程序:
public interface AbstractItem {
}
public SharpItem implements AbstractItem {
}
public BluntItem implements AbstractItem {
}
public interface AbstractToolbox {
//well the problem starts here...
public List<AbstractItem> getItems();
}
public ExpensiveToolbox implements AbstractToolbox {
private List<SharpItem> items = new ArrayList()<SharpItems>;
public List<SharpItem> getItems() { return this.items; }
}
public CheapTooblox implements AbstractToolbox {
private List<BluntItem> items = new ArrayList()<BluntItem>;
public List<BluntItem> getItems() { return this.items; }
}
很简单,对吧?好吧,假设我们现在想做一个这样的方法(在一些随机类中):
public void doImportantStuff(AbstractToolbox toolbox) {
//important stuff!
//this obviously won't work
List<AbstractToolbox> items = toolbox.getItems();
//do some stuffwith all items
}
现在的问题是,在Java中,泛型的集合不是协变的(希望这是我正在寻找的术语),并且我无法将一个分配给.我在这里看到的唯一解决方案是复制代码并为每种类型做一个版本,但这显然会很糟糕(如果我们有更多的类实现具有不同列表的 AbstractToolbox 呢?)。哦,显然第二种解决方案是删除泛型并制作一个正常的列表,但这是一种好的做法吗?ArrayList<ExpensiveToolbox>
List<AbstractToolbox>
是否有任何设计模式/实践来解决此类问题?
@Edit:好吧,所以我可能不够精确。我希望所有扩展 AbstractToolbox 的类都有一个扩展 AbstractItem 的某些类的列表,然后我想要一个方法,它将 AbstractToolbox 作为参数,并对其列表中的项目执行一些操作(使用将在 AbstractItem 中定义的类,以便每个可能列表的所有项目实际上都有它们)。