我有一种实用工具方法,其目标是将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>
?我该如何解决这个问题?
答案 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<>();