具有通用映射的方法签名扩展对象

gan*_*ers 1 java generics

虽然这段代码正在运行,但它仍然在研磨我的齿轮:

public static <K, V> Map<K, V> entityListToIdMap(List<? extends BaseEntity<K>> list, Class<K> keyClass) {
    Map<K, V> map = new TreeMap<K, V>();
    if(list != null){
        for (BaseEntity<K> item : list) {
            map.put(item.getId(), (V) item);
        }
    }
    return map;
}
Run Code Online (Sandbox Code Playgroud)

我所缺少的是,告诉方法签名,V extends BaseEntity<K>.这也可能导致未经检查的警告,这使得必须将值中的项目转换为V.

我怎么能V说它必须extend BaseEntity<K>?

基于@Ori Lentz接受的答案,完整的解决方案:

public static <K, V extends BaseEntity<K>> Map<K, V> entityListToIdMap(List<V> list, Class<K> keyClass) {
    Map<K, V> map = new TreeMap<K, V>();
    if (list != null) {
        for (V item : list) {
            map.put(item.getId(), item);
        }
    }
    return map;
}
Run Code Online (Sandbox Code Playgroud)

Ori*_*ntz 6

只需在定义泛型类型时定义它:

public static <K, V extends BaseEntity<K>> Map<K, V> entityListToIdMap(..) {
Run Code Online (Sandbox Code Playgroud)