Sobes.tech
Middle+

Cos'è il principio PECS e come viene applicato in Java?

sobes.tech AI

Risposta dell'AI

Il principio PECS (Producer Extends Consumer Super) è una regola mnemonica per determinare quando usare le parole chiave extends e super quando si lavora con tipi wildcard nei generici di Java.

  • Producer (Produttore): Quando si utilizza un parametro generico per recuperare dati (estrarre elementi da una collezione), si usa il wildcard con extends. La collezione agisce come un produttore di dati. Il tipo ? extends T significa "qualsiasi tipo che sia T o una sua sottoclasse". È possibile leggere gli elementi in modo sicuro come tipo T (o la sua superclasse), ma non si possono aggiungere elementi a tale collezione (tranne null).

  • Consumer (Consumatore): Quando si utilizza un parametro generico per aggiungere dati (inserire elementi in una collezione), si usa il wildcard con super. La collezione agisce come un consumatore di dati. Il tipo ? super T significa "qualsiasi tipo che sia T o una sua superclasse". È possibile aggiungere elementi di tipo T (o sue sottoclassi) a tale collezione, ma leggendo gli elementi si otterranno come Object.

Applicazione in Java:

Viene usato con tipi wildcard (?) per aumentare la flessibilità delle API che lavorano con collezioni o altri tipi generici, permettendo loro di lavorare con un intervallo più ampio di tipi, mantenendo la sicurezza del tipo.

Esempi:

// Esempio Producer
// Il metodo printAll legge da una List
public void printAll(List<? extends Number> list) {
    // È possibile leggere gli elementi come Number (o Object)
    for (Number num : list) {
        System.out.println(num);
    }
    // Non è possibile aggiungere elementi (tranne null)
    // list.add(123); // Errore di compilazione
}

// Esempio Consumer
// Il metodo addNumbers aggiunge a una List
public void addNumbers(List<? super Integer> list) {
    // È possibile aggiungere Integer o sue sottoclassi
    list.add(1);
    list.add(new Integer(2));
    // list.add(new Double(3.0)); // Errore di compilazione

    // Quando si legge, si ottiene Object
    Object o = list.get(0);
}