大佬教程收集整理的这篇文章主要介绍了Java集合协方差问题,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_301_0@快速解答:将类型更改为 List<? extends AbstractItem>
@H_301_0@想象一下这里的代码…
List<AbstractItem> foo = new ArrayList<SharpItem>();
foo.add(new BluntItem());
@H_301_0@静态打字说这应该工作…但是你不能这样做!它将违反ArrayList的类型。这就是为什么不允许这样做。如果您将其更改为
List<? extends AbstractItem> foo = new ArrayList<SharpItem>();
@H_301_0@然后,您可以进行分配,但不要在列表中添加任何内容。但是,您仍然可以从列表中检索元素作为AbstractItems。
@H_301_0@@H_301_0@不,绝对不是:-p
可以说我们有一个包含此类的程序:
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的泛型集合不是协变的(希望这是我要找的术语),我不能分配ArrayList<ExpensiveToolbox>
给一个List<AbstractToolbox>
。我在这里看到的唯一解决方案是复制代码并为每种类型做一个版本,但这显然很糟糕(如果我们有更多的类用不同的列表实现AbstractToolbox会怎样?)。哦,显然,第二种解决方法是删除泛型并创建一个普通的List,但这是一个好习惯吗?
是否有解决此类问题的设计模式/实践?
@Edit:好的,所以我可能不够精确。我希望所有扩展AbstractToolbox的类都具有某些扩展AbstractItem的类的列表,然后我想要一个方法,该方法将AbstractToolbox作为参数并对其列表中的项目进行某些操作(使用将在AbstractItem,因此每个可能的列表中的所有项目实际上都具有它们)。
以上是大佬教程为你收集整理的Java集合协方差问题全部内容,希望文章能够帮你解决Java集合协方差问题所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。