Hashmap

Sou i

Cada chave tem apenas um valor associado, esse valor associado vai depender do segundo tipo de classe que você passou entre o operador diamond <>

No exemplo que você passou aqui, você espera uma chave do tipo K e valor do tipo C

Sim, cada chave esta associada a um valor, entretanto, o mesmo valor pode estar associado a chaves distintas, ou seja, as únicas coisas distintas são as chaves.

Não, pois antes tem que verificar se a chave existe:

O algoritimo fornecido é:

adicione o valor v na coleção associada à chave k. Caso a chave não exista, deverá ser pedida uma coleção ao fornecedor c, à qual é adicionado o valor, e o par contendo k e a coleção obtida de c é colocado em m

Salvo interpretação distinta temos:

  1. Adicione o valor v na coleção (existente e) associada à chave k.
  2. Caso a chave não exista, deverá ser pedida uma coleção ao fornecedor(Supplier) c.
  3. À (Coleção obtida por meio de c) … é adicionado o valor (v).
  4. O par contendo k(a chave) e a coleção(valor) obtida de c é colocado em m (mapa).

Desenvolvendo:

/**
    *  K chave do mapa m
    *  C valor do mapa m, sendo uma coleção C<V>
    * @param c fornecedor de coleções C<V>
    * @param v objeto que compõe a coleção C<V>
    * a interface Supplier<T> é do tipo funcional, tem apenas o método T get() e fornece uma coleção C<V>;
    */
    void add( Map<K,C> m, K k, V v, Supplier<C> c){
        if (m.containsKey(k)) {
            m.get(k).add(v);// condição 1 atendida
        }else{
            C novaColecao = c.get();// condição 2 satisfeita
            novaColecao.add(v);//condição 3 satisfeita
            m.put(k, novaColecao);//condição 4 satisfeita
        }
    }
1 curtida

Fiquei muito mais esclarecido. Obrigado

Os erros que vc apontou estão relacionado à implementação da classe C sem a utilização de generics.

C extends Collection// errado

public class C implements Collection<V>{
//...
}