通用方法不适用于参数

use*_*760 3 java generics subtype

对不起,另一个"Java通用方法不适用"的问题.我想知道我的理解中缺少什么:

  1. List<E>Collection<E>
    - >含义List<String>的子类型,是子类型Collection<String>

  2. 假设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).

Sot*_*lis 6

这正是您在第二点中解释的问题.

假设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>

(我不是?用作通配符,我们现在不关心它)