程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Java集合协方差问题大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Java集合协方差问题?

开发过程中遇到Java集合协方差问题的问题如何解决?下面主要结合日常开发的经验,给出你关于Java集合协方差问题的解决方法建议,希望对你解决Java集合协方差问题有所启发或帮助; @H_301_0@您可能需要看一下对通配符使用通配符类型。快速链接如下:什么是PECS(生产者扩展了超级消费者)?

@H_301_0@快速解答:将类型更改为 List<? extends AbstractItem>

@H_301_0@

@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,请注明来意。
标签: