HashMap<Integer,List<Integer>> test = new HashMap<Integer,ArrayList<Integer>>();
这一行给出了错误:HashMap<Integer,ArrayList<Integer>> cannot be converted to HashMap<Integer,List<Integer>>
我不明白为什么这不起作用。
答案 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
,而不会导致播放异常。