java - Set 不适用于 Java 泛型方法中的 Collection

标签 java generics set generic-collections

我在 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)

车削CollectionSetsortedValuesFromMap的签名中会修复它——但我不想这样做。那么为什么 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/

相关文章:

java - 为什么这行代码不起作用?

C# 从泛型基类中的字段反射 GetValue

给定重复元素集中不同元素子集总数的算法

matlab - 无法设置Matlab类的参数

c++ - 将结构元素插入有序集失败

java - 验证 XML 签名 JAVA

java - 将 Int 转换为 Java 中的枚举

java - 小数点后的固定位数

带有通配符的 Java 泛型类型

java - 是否使用泛型?