HashMap<Integer,List<Integer>> test = new HashMap<Integer,ArrayList<Integer>>();
这一行给了我错误:HashMap<Integer,ArrayList<Integer>> cannot be converted to HashMap<Integer,List<Integer>>
我不明白为什么这不起作用。
底层HashMap
将限制为ArrayList
s,但引用将允许您添加任何类型的列表。如果您尝试向HashMap
添加LinkedList
怎么办?
可能,您只需要对List
进行HashMap
:
HashMap<Integer, List<Integer>> test = new HashMap<Integer, List<Integer>>();
或者,如果您真的想要它只包含ArrayList
s 的限制:
HashMap<Integer, ArrayList<Integer>> test = new HashMap<Integer, ArrayList<Integer>>();
请注意,此类问题称为协方差和逆变。
另请参阅:
- 在 Java 中演示协方差和逆变?
- 协方差、不变性和逆变用简单的英语解释?
这个链接是关于C#而不是Java的,但它是我所知道的概念的最佳解释之一。它不会像适用于 C# 那样适用于 Java,但它应该是一个有用的读物:
- https://blogs.msdn.microsoft.com/ericlippert/2007/10/16/covariance-and-contravariance-in-c-part-one/
它不起作用,因为它是"不安全的",它不安全的原因是因为你将持有对同一列表的两个引用,具有这两种类型:
HashMap<Integer,List<Integer>> a;
HashMap<Integer,ArrayList<Integer>> b;
因此,如果您看到LinkedList<Integer>
的预期值类型,则可以将其添加两个a
,但将其添加到b
是不可以的,因为LinkedList
不是ArrayList
。因此,通过创建a
引用b
您将创建一个后门,以从参考角度b
破坏地图的内容。
例如,有人从期望ArrayList
b
中提取值,LinkedList
而不是导致强制转换异常。