首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不能将HashMap<Integer,ArrayList<Integer>>转换为HashMap<Integer,List<Integer>>

为什么不能将HashMap<Integer,ArrayList<Integer>>转换为HashMap<Integer,List<Integer>>
EN

Stack Overflow用户
提问于 2017-08-10 03:58:37
回答 2查看 359关注 0票数 1
代码语言:javascript
复制
HashMap<Integer,List<Integer>> test = new HashMap<Integer,ArrayList<Integer>>();

这一行给出了错误:HashMap<Integer,ArrayList<Integer>> cannot be converted to HashMap<Integer,List<Integer>>

我不明白这为什么行不通。

EN

回答 2

Stack Overflow用户

发布于 2017-08-10 04:05:45

底层的HashMap将被限制为ArrayLists,但是引用将允许您添加任何类型的列表。如果您试图向HashMap中添加一个LinkedList,该怎么办

也许,您只需要创建ListHashMap

代码语言:javascript
复制
HashMap<Integer, List<Integer>> test = new HashMap<Integer, List<Integer>>();

或者,如果您真的想限制它只包含ArrayList

代码语言:javascript
复制
HashMap<Integer, ArrayList<Integer>> test = new HashMap<Integer, ArrayList<Integer>>();

请注意,这种问题称为协方差和逆方差。

另请参阅:

这个链接是关于C#的,而不是Java,但这是我所知道的对这个概念的最好的解释之一。它不会以同样的方式应用于Java和C#,但它应该是一个有用的读物:

票数 2
EN

Stack Overflow用户

发布于 2017-08-10 04:09:59

它不工作是因为它是“不安全的”,而它是不安全的原因是因为您将使用这两种类型持有对同一列表的两个引用:

代码语言:javascript
复制
HashMap<Integer,List<Integer>> a;
HashMap<Integer,ArrayList<Integer>> b;

因此,如果您看到的是LinkedList<Integer>类型的预期值,可以将其添加两个a,但不能将其添加到b中,因为LinkedList不是ArrayList。因此,通过在b之外创建a引用,您正在创建一个后门来破坏b引用透视图中的地图内容。

例如,如果有人从期望ArrayListb中提取值,那么最终会得到一个LinkedList,这会导致强制转换异常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45599608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档