为什么HashMap <integer,arraylist <integer>&gt;转换为HashMap <integer,list <integer>&gt;

时间:2017-08-09 19:58:37

标签: java arraylist

HashMap<Integer,List<Integer>> test = new HashMap<Integer,ArrayList<Integer>>();

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

我不明白为什么这不起作用。

2 个答案:

答案 0 :(得分:2)

基础HashMap将仅限于ArrayList,但引用将允许您添加任何类型的列表。如果您尝试将LinkedList添加到HashMap

,该怎么办?

可能您需要HashMap List

HashMap<Integer, List<Integer>> test = new HashMap<Integer, List<Integer>>();

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

HashMap<Integer, ArrayList<Integer>> test = new HashMap<Integer, ArrayList<Integer>>();

请注意,此类问题称为协方差和逆变。

另见:

这个链接是关于C#而不是Java,但是对我所知的概念的最佳解释之一。它不会像对C#一样适用于Java,但它应该是一个有用的读物​​:

答案 1 :(得分:0)

它不起作用,因为它不安全&#34;,它不安全的原因是因为你将使用这两种类型持有对同一列表的两个引用:

HashMap<Integer,List<Integer>> a;
HashMap<Integer,ArrayList<Integer>> b;

因此,如果您看到类型为LinkedList<Integer>的预期值,则可以将其添加两个a,但将其添加到b是不行的LinkedList不是ArrayList。因此,通过从a创建b引用,您将创建一个后门,以便从b参考角度破坏地图内容。

例如,有人从b中提取期望ArrayList的值会导致LinkedList,而不会导致播放异常。