我有一段代码用于生成图表:
HashMap<String, List<Ticket>> openedTicketsPerTeam = getOpenedTicketsPerTeam();
如何编写通用方法的签名来计算列表长度,每个Map元素? 我的想法是:
Map<String, Integer> getNumOfValuesPerKey(HashMap<String, List<? extends Object>> map) {...}
但是在调用之后会出现转换错误:
HashMap<String, Integer> numOfTicketsPerTeam = getNumOfValuesPerKey(openedTicketsPerTeam );
答案 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;
}