Java 为什么可以';不能扩展集合泛型类型

Java 为什么可以';不能扩展集合泛型类型,java,generics,collections,Java,Generics,Collections,我有一个实用方法,其目标是将集合转换为映射。但是,当我尝试使用泛型时,它给出了一个编译错误,我想知道如何修复它: public static <K, V> Map<K, V> convertCollectionToMap(Collection<V extends ListToMapConvertable<K, V>> sourceList) { Map<K, V> newMap = new HashMap<K, V>

我有一个实用方法,其目标是将
集合
转换为
映射
。但是,当我尝试使用泛型时,它给出了一个编译错误,我想知道如何修复它:

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);
}
public静态映射convertioncollectiontomap(集合源列表){
Map newMap=newhashmap();
对于(V项:源列表){
newMap.put(item.getKey(item),item);
}
返回newMap;
} 
公共接口列表为PConvertable{
公共K getKey(V项);
}

相反,我得到的
类型集合的参数数量不正确;无法使用参数对其进行参数化
编译错误。我不理解这个问题,因为
V
只是扩展了
列表到pconverable
。那么为什么它声称我使用了两个参数--
?我该如何解决这个问题呢?

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

public static <K, V extends ListToMapConvertable<K, V>> Map<K, V> convertCollectionToMap(Collection<V> sourceList) {
     ....
} 
public静态映射convertioncollectiontomap(集合源列表){
....
} 
另请注意,菱形运算符(从Java 7开始提供)允许在实例化的对象声明中不重复泛型类型。
这就足够了:

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

您不能将泛型绑定
扩展…
放在那里。您需要将它放在泛型参数声明(即初始值
)上。我不知道Java 7+中的菱形运算符能够理解引用中定义的参数化值,并且在实例化中不需要它们。谢谢你提到它。不客气:)但是我不确定你的实际代码是否会产生预期的结果
ListToMapConvertable
声明和
convertCollectionToMap()
之间不一致。根据
listomapconvertable
的定义,
V
不同于
listomapconvertable
类型。而
item.getKey(item)
认为
listtompconvertable
getKey()
的参数依赖于相同的类型。