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()
的参数依赖于相同的类型。