Classi Generiche con Parametri Multipli in Java

Concetti Chiave
  • Le classi generiche possono avere più di un parametro di tipo.
  • I parametri di tipo multipli sono separati da virgole nella dichiarazione della classe.
  • La sintassi per creare un oggetto di una classe generica con parametri multipli è simile a quella con un singolo parametro, ma include tutti i parametri di tipo.

Una Classe Generica con Due Parametri di Tipo

È possibile dichiarare più di un parametro di tipo in un tipo generico.

Per specificare due o più parametri di tipo, si utilizza semplicemente un elenco separato da virgole. Ad esempio, la seguente classe DueGen è una variazione della classe Gen che ha due parametri di tipo:

// Una semplice classe generica con due parametri
// di tipo: T e V.
class DueGen<T, V> {

    // Questi oggetti sono di tipo T e V.
    T ogg1;
    V ogg2;

    // Passa al costruttore un riferimento a
    // un oggetto di tipo T e un oggetto di tipo V.
    DueGen(T o1, V o2) {
        ogg1 = o1;
        ogg2 = o2;
    }

    // Mostra i tipi di T e V.
    void mostraTipi() {
        System.out.println("Il tipo di T è " +
                            ogg1.getClass().getName());
        System.out.println("Il tipo di V è " +
                            ogg2.getClass().getName());
    }

    // Restituisce ogg1.
    T getOgg1() {
        return ogg1;
    }

    // Restituisce ogg2.
    V getOgg2() {
        return ogg2;
    }

}

// Dimostra DueGen.
class GenSemplice {

    public static void main(String[] args) {
        DueGen<Integer, String> oggettoTg =
            new DueGen<Integer, String>(88, "Generici");

        // Mostra i tipi.
        oggettoTg.mostraTipi();

        // Ottiene e mostra i valori.
        int v = oggettoTg.getOgg1();
        System.out.println("valore: " + v);
        String str = oggettoTg.getOgg2();
        System.out.println("valore: " + str);
    }

}

L'output di questo programma è mostrato qui:

Il tipo di T è java.lang.Integer
Il tipo di V è java.lang.String
valore: 88
valore: Generici

Si noti come DueGen viene dichiarata:

class DueGen<T, V> {
    /* ... */
}

Vengono specificati due parametri di tipo: T e V, separati da una virgola. Poiché la classe ha due parametri di tipo, due argomenti di tipo devono essere passati a DueGen quando viene creato un oggetto, come mostrato di seguito:

DueGen<Integer, String> oggettoTg =
    new DueGen<Integer, String>(88, "Generici");

In questo caso, Integer viene sostituito per T, e String viene sostituito per V.

Sebbene i due argomenti di tipo differiscano in questo esempio, è possibile che entrambi i tipi siano uguali. Ad esempio, la seguente riga di codice è valida:

DueGen<String, String> x =
    new DueGen<String, String> ("A", "B");

In questo caso, sia T che V sarebbero di tipo String. Naturalmente, se gli argomenti di tipo fossero sempre gli stessi, allora due parametri di tipo sarebbero inutili.

La Forma Generale di una Classe Generica

La sintassi di una classe generica vista nell'esempio precedente può essere generalizzata al caso di più parametri di tipo.

Per cui la forma generale di una classe generica con parametri multipli è:

class nome_classe<T, V, ...> {
    // Dichiarazioni di variabili e metodi
    // che utilizzano i parametri di tipo T, V, ...
}

Di conseguenza, la sintassi per creare un oggetto di una classe generica con parametri multipli è:

nome_classe<T, V, ...> nome_oggetto =
    new nome_classe<T, V, ...>(argomento1, argomento2, ...);