繁体   English   中英

为什么不能扩展通用类型

[英]Why Can't Collection Generic Type be Extended

我有一个实用程序方法,其目标是将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> Incorrect number of arguments for type Collection<E>; it cannot be parameterized with arguments <V, ListToMapConvertable>编译错误Incorrect number of arguments for type Collection<E>; it cannot be parameterized with arguments <V, ListToMapConvertable> 我不明白这个问题,因为V只是在扩展 ListToMapConverable 那么,为什么它声称我使用了两个参数- <V, ListToMapConvertable> 我该如何解决?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM