Java 泛型方法不适用于参数

Java 泛型方法不适用于参数,java,generics,subtype,Java,Generics,Subtype,抱歉,还有另一个“Java通用方法不适用”的问题。我想知道我的理解中遗漏了什么: 列表是集合的子类型 -->意思是,List是Collection 假设A扩展了B,List不是List的子类型 -->但在这种情况下,只有一种类型T(或String),所以我不明白替换原则如何解释我的问题 问题代码: private <T, K> void genericAddToMapOfLists(HashMap<K, Collection<T>> mapOfLists,

抱歉,还有另一个“Java通用方法不适用”的问题。我想知道我的理解中遗漏了什么:

  • 列表
    集合的子类型

    -->意思是,
    List
    Collection

  • 假设A扩展了B,
    List
    不是
    List
    的子类型
    -->但在这种情况下,只有一种类型
    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);
    }
    
    private void generalicaddtomapoflists(HashMap-mapOfLists,
    K键,T值){
    if(列表的映射。容器(键)){
    mapOfLists.get(key).add(value);
    }否则{
    List newList=newarraylist();
    添加(值);
    mapOfLists.put(key,newList);
    }
    }
    私有void parsetFruitlist(HashMap水果颜色,
    字符串(名称){
    字符串颜色=”;
    通用的果酱(水果颜色、水果名称、颜色);
    }
    
    错误

    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)
    
    MyGroceryStore类型中的genericAddToMapOfLists(HashMap,K,T)方法不适用于参数(HashMap,String,String)
    当我将方法签名更改为
    genericAddToMapOfLists(HashMap,K,T)
    时,代码就会工作

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

    假设
    A
    扩展
    B
    List
    不是
    List

    在这种情况下,您的方法需要

    HashMap<?, Collection<?>>
    
    HashMap>
    
    但是你在给它

    HashMap<?, List<?>>
    
    HashMap>
    
    List
    扩展了
    Collection
    ,但是
    HashMap你说得对“
    List
    Collection
    的子类型”。如果
    A
    扩展
    B
    List
    不是
    List
    的子类型

    更进一步说,
    HashMap
    不是
    HashMap


    同样的推理也适用,其中
    A
    列表
    B
    集合
    。如果一个
    HashMap
    是一个
    HashMap
    ,那么你可以
    向量
    分配给
    HashMap
    ,将其放入
    HashMap
    ,即使
    向量
    不是
    列表,因此它是不允许的。

    不需要在标题中添加主标记。