generic を組み合わせた Java さんの挙動がよく分かりません orz

static public <K, V> Map<K, ? extends List<V> > safePut(Map<K, ? extends List<V> > map, K key, V value)
{
    List<V> list = map.get(key);
    if(list == null)
    {
        list = new ArrayList<V>();
        map.put(key, list); // だめ
        // ↑The method put(K, capture#2-of ? extends List<V>)
        // in the type Map<K,capture#2-of ? extends List<V>>
        // is not applicable for the arguments (K, List<V>)
    }
    list.add(value);
    
    return map;
}

"? extends List" に対して "List" が put 出来ないのは何故なんだぜ… orz

"? extends" を取っ払ったら put 出来るようになったものの、ソレだと汎用性がなくなっちゃうしなぁー…