HashMap<Integer,List<Integer>> test = new HashMap<Integer,ArrayList<Integer>>();这一行给出了错误:HashMap<Integer,ArrayList<Integer>> cannot be converted to HashMap<Integer,List<Integer>>
我不明白这为什么行不通。
发布于 2017-08-10 04:05:45
底层的HashMap将被限制为ArrayLists,但是引用将允许您添加任何类型的列表。如果您试图向HashMap中添加一个LinkedList,该怎么办
也许,您只需要创建List的HashMap
HashMap<Integer, List<Integer>> test = new HashMap<Integer, List<Integer>>();或者,如果您真的想限制它只包含ArrayList:
HashMap<Integer, ArrayList<Integer>> test = new HashMap<Integer, ArrayList<Integer>>();请注意,这种问题称为协方差和逆方差。
另请参阅:
这个链接是关于C#的,而不是Java,但这是我所知道的对这个概念的最好的解释之一。它不会以同样的方式应用于Java和C#,但它应该是一个有用的读物:
发布于 2017-08-10 04:09:59
它不工作是因为它是“不安全的”,而它是不安全的原因是因为您将使用这两种类型持有对同一列表的两个引用:
HashMap<Integer,List<Integer>> a;
HashMap<Integer,ArrayList<Integer>> b;因此,如果您看到的是LinkedList<Integer>类型的预期值,可以将其添加两个a,但不能将其添加到b中,因为LinkedList不是ArrayList。因此,通过在b之外创建a引用,您正在创建一个后门来破坏b引用透视图中的地图内容。
例如,如果有人从期望ArrayList的b中提取值,那么最终会得到一个LinkedList,这会导致强制转换异常。
https://stackoverflow.com/questions/45599608
复制相似问题