很抱歉还有另一个“ Java通用方法不适用”的问题。我想知道我的理解中缺少什么:
List<E>
是Collection<E>
->含义List<String>
的子类型,是...的子类型Collection<String>
假设A扩展了B,List<A>
它不是List<B>
->的子类型,但是在这种情况下,只有一个类型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)
。
您是对的,“List<String>
是子类型Collection<String>
”。如果A
扩展B
,List<A>
则不是的子类型List<B>
。
更进一步,aHashMap<String, List<String>>
不是a HashMap<String, Collection<String>>
。
相同的推理适用,其中A
isList
和B
is Collection
。如果aHashMap<String, List<String>>
是HashMap<String, Collection<String>>
,则可以将其分配给,从而将put
aVector<String>
变成a ,即使a不是,因此也是不允许的。HashMap<String, List<String>>
HashMap<String, Collection<String>>
Vector
List
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句