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


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

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

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

底层HashMap将限制为ArrayLists,但引用将允许您添加任何类型的列表。如果您尝试向HashMap添加LinkedList怎么办?

可能,您只需要对List进行HashMap

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

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

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破坏地图的内容。

例如,有人从期望ArrayListb中提取值,LinkedList而不是导致强制转换异常。

最新更新