通用方法不适用于参数

时间:2013-12-13 21:06:08

标签: java generics subtype

很抱歉还有另一个“Java泛型方法不适用”的问题。我想知道我的理解中缺少什么:

  1. List<E>Collection<E>的子类型 - &GT;意思是,List<String>Collection<String>

  2. 的子类型
  3. 假设A扩展B,List<A> List<B>的子类型 - &GT;但在这种情况下,只有一种类型T(或String),所以我不知道替代原则如何解释我的问题?

  4. 问题代码

    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)时,代码可以正常工作。

2 个答案:

答案 0 :(得分:6)

这正是你在第二点解释的问题。

  

假设A延伸BList<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>>AListB。如果CollectionHashMap<String, List<String>>,那么您可以HashMap<String, Collection<String>>put分配到Vector<String>,方法是将其分配给HashMap<String, List<String>>,即使HashMap<String, Collection<String>>不是Vector,因此不允许这样做。