use*_*760 3 java generics subtype
对不起,另一个"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);
}
Run Code Online (Sandbox Code Playgroud)
错误:
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)
Run Code Online (Sandbox Code Playgroud)
当我将方法签名更改为时,代码有效genericAddToMapOfLists(HashMap<K,List<T>>, K, T).
这正是您在第二点中解释的问题.
假设
A扩展B,List<A>不是子类型List<B>
在这种情况下,您的方法需要
HashMap<?, Collection<?>>
Run Code Online (Sandbox Code Playgroud)
但你是在给它
HashMap<?, List<?>>
Run Code Online (Sandbox Code Playgroud)
List扩展Collection,但HashMap<?, List>不是子类型HashMap<?, Collection>
(我不是?用作通配符,我们现在不关心它)