有什么问题
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>
。我是否必须提供特定类别的列表?为什么?
答案 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作为值有意义的用法。你应该重新思考你的设计。