很抱歉还有另一个“Java泛型方法不适用”的问题。我想知道我的理解中缺少什么:
List<E>
是Collection<E>
的子类型
- &GT;意思是,List<String>
是Collection<String>
假设A扩展B,List<A>
不是List<B>
的子类型
- &GT;但在这种情况下,只有一种类型T
(或String
),所以我不知道替代原则如何解释我的问题?
问题代码:
private <T, K> void genericAddToMapOfLists(HashMap<K, Collection<T>> mapOfLists,
K key, T value) {
if (mapOfLists.containsKey(key)) {
mapOfLists.get(key).add(value);
} else {
List<T> newList = new ArrayList<T>();
newList.add(value);
mapOfLists.put(key, newList);
}
}
private void parseToFruitList(HashMap<String, List<String>> fruit_colors,
String fruitName) {
String color = "";
genericAddToMapOfLists(fruit_colors, fruitName, color);
}
错误:
The method genericAddToMapOfLists(HashMap<K,Collection<T>>, K, T) in the type MyGroceryStore is not applicable for the arguments (HashMap<String,List<String>>, String, String)
当我将方法签名更改为genericAddToMapOfLists(HashMap<K,List<T>>, K, T)
时,代码可以正常工作。
答案 0 :(得分:6)
这正是你在第二点解释的问题。
假设
的子类型A
延伸B
,List<A>
不是List<B>
在这种情况下,您的方法需要
HashMap<?, Collection<?>>
但你正在给它
HashMap<?, List<?>>
List
扩展Collection
,但HashMap<?, List>
不是HashMap<?, Collection>
(我没有使用?
作为通配符,我们现在不关心它)
答案 1 :(得分:2)
你是对的,“List<String>
是Collection<String>
的子类型”。如果A
延伸B
,则List<A>
<{1}}
更进一步,List<B>
不是HashMap<String, List<String>>
。
同样的推理适用,HashMap<String, Collection<String>>
为A
且List
为B
。如果Collection
是HashMap<String, List<String>>
,那么您可以HashMap<String, Collection<String>>
将put
分配到Vector<String>
,方法是将其分配给HashMap<String, List<String>>
,即使HashMap<String, Collection<String>>
不是Vector
,因此不允许这样做。