【发布时间】:2016-11-08 14:30:20
【问题描述】:
我有一个带有以下签名的方法:
public <T> int numberOfValues(Map<T, Set<?>> map)
但是我不能通过 Map<String, Set<String>> 调用它。例如,以下内容无法编译:
Map<String, Set<String>> map = new HashMap<>();
numberOfValues(map);
错误信息是:
numberOfValues (java.util.Map<java.lang.String,java.util.Set<?>>) in class cannot be applied to (java.util.Map<java.lang.String,java.util.Set<java.lang.String>>)
但是,如果我更改为以下一切都很好:
public <T, V> int numberOfValues(Map<T, Set<V>> map)
但是我对V 一点也不感兴趣,因为我只想知道每个集合的大小。
为了完整起见,这是整个方法:
public <T, V> int numberOfValues(Map<T, Set<V>> map) {
int n = 0;
for (T key : map.keySet()) {
n += map.get(key).size();
}
return n;
}
我知道它也可以像这样完成,但这不是问题的重点:)
public <T> int numberOfValues(Map<?, Set<T>> map) {
int n = 0;
for (Set<T> value : map.values()) {
n += value.size();
}
return n;
}
更新:实现相同目标的另一种方法
public <T> int numberOfValues(Map<?, Set<T>> map) {
int n = 0;
for (Object key : map.keySet()) {
n += map.get(key).size();
}
return n;
}
最终更新: 感谢 Jorn 的回答,这是最终的实现……
public int numberOfValues(Map<?, ? extends Set<?>> map) {
int n = 0;
for (Set<?> value : map.values()) {
n += value.size();
}
return n;
}
【问题讨论】:
-
您没有展示您是如何尝试调用该方法的,这很难帮助您。请提供minimal reproducible example。
-
已修复,我添加了一段代码 sn-p,说明如何使用空映射调用该方法。
-
又不能
map.get(key)返回null?