我在 java 中定义了一个带有签名的通用函数
<V> List<V> sortedValuesFromMap(Map<?, Collection<V>> keysValues, Comparator<V> comp)
它采用将任何类型的键映射到某个已定义类型 V 的集合的 Map 以及 V 类型的比较器。该方法效果很好,并且 Java 编译器不会提示类型不兼容。
但是现在当我想将此方法应用于 Map<String, Set<String>>
类型的 map 时和 AlphanumComparator
(参见 here )编译器说:
The method
sortedValuesFromMap(Map<?,Collection<V>>, Comparator<V>)
in the type MyUtils is not applicable for the arguments (Map<String,Set<String>, AlphanumComparator
)
车削Collection
至Set
在sortedValuesFromMap
的签名中会修复它——但我不想这样做。那么为什么 Java 强制我这样做,尽管Set<E>
是 implementing Collection<E>
?
PS:如果有人对我的代码感兴趣:
public static <V> List<V> sortedValuesFromMap(Map<?, Collection<V>> keysValues,
Comparator<V> comp) {
List<V> values = new LinkedList<V>();
for (Collection<V> col : keysValues.values()) {
values.addAll(col);
}
Collections.sort(values, comp);
return values;
}
最佳答案
就像 List<Dog>
is not a List<Animal>
,一个Map<String, Set<String>>
不是Map<String, Collection<String>>
这不是 Map<?, Collection<String>>
.
这里的解决方案是添加通配符来代替 Set
允许在泛型类型参数中使用子类。
// Add v
public static <V> List<V> sortedValuesFromMap(Map<?, ? extends Collection<V>> keysValues,
Comparator<V> comp) {
关于java - Set 不适用于 Java 泛型方法中的 Collection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22235343/