java泛型方法调用转换错误

时间:2012-08-07 06:25:06

标签: java list generics hashmap type-conversion

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

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

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

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

但是在调用之后会出现转换错误:

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

3 个答案:

答案 0 :(得分:2)

像这样的东西(可用于任何K以及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}

答案 1 :(得分:1)

试试这个:

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

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

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

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

更改是将参数设为Map(不是HashMap)和List<?>(不是List<? extends Object>,这是相同的事情,但更为残酷)

答案 2 :(得分:0)

无需实际参数化值类型。您对Map<K, List<?>>的问题是非通配符通用参数必须完全匹配。因此,在Map的第二个类型参数中,List<?>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;
}