【问题标题】:java generic method invocation conversion errorjava泛型方法调用转换错误
【发布时间】:2012-08-04 03:19:06
【问题描述】:

我有一段代码用来生成图表:

HashMap<String, List<Ticket>> openedTicketsPerTeam = getOpenedTicketsPerTeam();

我应该如何编写泛型方法的签名来计算列表的长度,每个 Map 元素? 我的想法是:

Map<String, Integer> getNumOfValuesPerKey(HashMap<String, List<? extends Object>> map) {...}

但调用后出现转换错误:

HashMap<String, Integer> numOfTicketsPerTeam = getNumOfValuesPerKey(openedTicketsPerTeam );

【问题讨论】:

  • 你能发布错误吗?

标签: java list generics hashmap type-conversion


【解决方案1】:

类似这样的东西(可用于anyKVs的任何列表):

public static <K, V> Map<K, Integer> getNumOfValuesPerKey(Map<K, List<V>> map) {

    Map<K, Integer> count = new HashMap<K, Integer>();

    for (Entry<K, List<V>> entry : map.entrySet()) 
        count.put(entry.getKey(), entry.getValue().size());

    return count;
}

示例:

public static void main(String[] args) {

    HashMap<String, List<Integer>> map = new HashMap<String, List<Integer>>();

    map.put("Hello", Arrays.asList(1,2,3));
    map.put("World", Arrays.asList(4,5));

    System.out.println(getNumOfValuesPerKey(map));
}

输出:

{Hello=3, World=2}

【讨论】:

    【解决方案2】:

    试试这个:

    Map<String, Integer> numOfTicketsPerTeam = getNumOfValuesPerKey(openedTicketsPerTeam );
    

    您的方法(正确)返回 Map&lt;String, Integer&gt;,但您将其分配给 HashMap&lt;String, Integer&gt; - Map 有多种类型,编译器无法知道您的实现返回 HsshMap。

    请注意,您可以而且应该将方法签名简化为:

    Map<String, Integer> getNumOfValuesPerKey(Map<String, List<?>> map) {...}
    

    更改是使参数成为Map(不是HashMap)和List&lt;?&gt;(不是List&lt;? extends Object&gt;,这是相同的东西,但更笨拙)

    【讨论】:

      【解决方案3】:

      实际上不需要对值类型进行参数化。 Map&lt;K, List&lt;?&gt;&gt; 的问题是非通配符泛型参数必须完全匹配。所以在Map的第二个类型参数中,List&lt;?&gt;不匹配List&lt;Ticket&gt;。正确的做法是也将其设为通配符(另外还可以使用实现类,例如 ArrayList 作为参数):

      public static <K> Map<K, Integer> getNumOfValuesPerKey(Map<K, ? extends List<?>> map) {
      
          Map<K, Integer> count = new HashMap<K, Integer>();
      
          for (Map.Entry<K, ? extends List<?>> entry : map.entrySet()) 
              count.put(entry.getKey(), entry.getValue().size());
      
          return count;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-14
        • 2021-03-17
        • 1970-01-01
        • 2019-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多