Sobes.tech
Middle+

O que é o princípio PECS e como é aplicado em Java?

sobes.tech IA

Resposta da IA

O princípio PECS (Producer Extends Consumer Super) é uma regra mnemónica para determinar quando usar as palavras-chave extends e super ao trabalhar com tipos curinga em genéricos Java.

  • Produtor (Producer): Quando utilizas um parâmetro genérico para obter dados (extrair elementos de uma coleção), usa um curinga com extends. A coleção atua como um produtor de dados. O tipo ? extends T significa "qualquer tipo que seja T ou sua subclasse". Podes ler elementos com segurança como tipo T (ou sua superclasse), mas não podes adicionar elementos a tal coleção (exceto null).

  • Consumidor (Consumer): Quando utilizas um parâmetro genérico para adicionar dados (colocar elementos numa coleção), usa um curinga com super. A coleção atua como um consumidor de dados. O tipo ? super T significa "qualquer tipo que seja T ou sua superclasse". Podes adicionar elementos de tipo T (ou suas subclasses) a tal coleção, mas ao leres elementos, vais obtê-los como Object.

Aplicação em Java:

Usa-se com tipos curinga (?) para aumentar a flexibilidade das APIs que trabalham com coleções ou outros tipos genéricos, permitindo que funcionem com um intervalo mais amplo de tipos, mantendo a segurança de tipos.

Exemplos:

// Exemplo Produtor
// O método printAll lê de uma List
public void printAll(List<? extends Number> list) {
    // Podemos ler elementos como Number (ou Object)
    for (Number num : list) {
        System.out.println(num);
    }
    // Não podemos adicionar elementos (exceto null)
    // list.add(123); // Erro de compilação
}

// Exemplo Consumidor
// O método addNumbers adiciona a uma List
public void addNumbers(List<? super Integer> list) {
    // Podemos adicionar Integer ou suas subclasses
    list.add(1);
    list.add(new Integer(2));
    // list.add(new Double(3.0)); // Erro de compilação

    // Ao ler, obtemos Object
    Object o = list.get(0);
}