私人地图<list <k>,V&gt; multiMap = new HashMap <arraylist <k>,V&gt;(); </arraylist <k> </list <k>

时间:2011-09-05 09:03:28

标签: java generics

有什么问题
private Map<List<K>, V> multiMap= new HashMap<ArrayList<K>,V>();

编译器说它Type mismatch: cannot convert from HashMap<ArrayList<K>,V> to Map<List<K>,V>。我是否必须提供特定类别的列表?为什么?

4 个答案:

答案 0 :(得分:14)

你必须写

private Map<List<K>, V> multiMap= new HashMap<List<K>,V>();

通用参数的值必须在两侧完全匹配(只要您不使用通配符)。原因是Java Generics没有对立/协方差(HashMap<List>不是HashMap<ArrayList>的超类型,尽管List当然是ArrayList的超类型。 / p>

答案 1 :(得分:2)

这是因为Map<ArrayList> 不是<{1}},即使Map<List>ArrayList。虽然这听起来有点违反直觉,但这是有充分理由的。这是a previous answer of mine to a similar question,它更详细地解释了这背后的原因。

答案 2 :(得分:2)

尝试:

private Map<? extends List<K>, V> multiMap= new HashMap<ArrayList<K>,V>();

答案 3 :(得分:2)

顺便说一句:如果你想要一个Multimap,我很确定你需要Map<K, List<V>>而不是Map<List<K>>, V>。列表制作了可怜的哈希键,我想不出任何使用List作为键和单个Object作为值有意义的用法。你应该重新思考你的设计。