为什么不能扩展集合通用类型

时间:2018-01-27 12:44:11

标签: java generics collections

我有一种实用工具方法,其目标是将Collection转换为Map。但是,当我尝试使用泛型时,它会出现编译错误,并且想知道如何解决它:

public static <K, V> Map<K, V> convertCollectionToMap(Collection<V extends ListToMapConvertable<K, V>> sourceList) {
    Map<K, V> newMap = new HashMap<K, V>();
    for (V item : sourceList) {
        newMap.put(item.getKey(item), item);
    }

    return newMap;
} 

public interface ListToMapConvertable<K, V> {
    public K getKey(V item);
}

相反,我收到Incorrect number of arguments for type Collection<E>; it cannot be parameterized with arguments <V, ListToMapConvertable>编译错误。我不明白这个问题,因为V只是延伸 ListToMapConverable。那么为什么它声称我使用了两个参数 - <V, ListToMapConvertable>?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:6)

上限应该在类型的声明中指定,而不是在参数声明中指定:

public static <K, V extends ListToMapConvertable<K, V>> Map<K, V> convertCollectionToMap(Collection<V> sourceList) {
     ....
} 

作为旁注,请注意菱形运算符(自Java 7起可用)允许不在实例化对象声明中重复泛型类型。
所以这就足够了:

Map<K, V> newMap = new HashMap<>();