2

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

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

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

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

但调用后出现转换错误:

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

3 回答 3

1

像这样的东西(可以用于任何K和 s 的任何列表V):

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}
于 2012-08-07T06:36:07.690 回答
1

试试这个:

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

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

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

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

更改是使参数 a Map(不是 a HashMap) 和List<?>(not List<? extends Object>,这是同一件事但更笨拙)

于 2012-08-07T06:38:10.013 回答
0

实际上不需要对值类型进行参数化。您遇到的问题Map<K, List<?>>是非通配符泛型参数必须完全匹配。所以在第二类参数中MapList<?>不匹配List<Ticket>。正确的做法是也将其设为通配符(另外还有一个好处是能够与实现类一起工作,例如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;
}
于 2012-08-07T19:40:22.487 回答