Java Language Liaison du paramètre générique à plus de 1 type


Exemple

Les paramètres génériques peuvent également être liés à plusieurs types à l'aide de la syntaxe T extends Type1 & Type2 & ... .

Supposons que vous souhaitiez créer une classe dont le type générique devrait implémenter Flushable et Closeable , vous pouvez écrire

class ExampleClass<T extends Flushable & Closeable> {
}

Maintenant, ExampleClass accepte uniquement comme paramètres génériques, les types qui implémentent à la fois Flushable et Closeable .

ExampleClass<BufferedWriter> arg1; // Works because BufferedWriter implements both Flushable and Closeable

ExampleClass<Console> arg4; // Does NOT work because Console only implements Flushable
ExampleClass<ZipFile> arg5; // Does NOT work because ZipFile only implements Closeable

ExampleClass<Flushable> arg2; // Does NOT work because Closeable bound is not satisfied.
ExampleClass<Closeable> arg3; // Does NOT work because Flushable bound is not satisfied.

Les méthodes de classe peuvent choisir d'inférer des arguments de type générique comme Closeable ou Flushable .

class ExampleClass<T extends Flushable & Closeable> {
    /* Assign it to a valid type as you want. */
    public void test (T param) {
        Flushable arg1 = param; // Works
        Closeable arg2 = param; // Works too.
    }

    /* You can even invoke the methods of any valid type directly. */
    public void test2 (T param) {
        param.flush(); // Method of Flushable called on T and works fine.
        param.close(); // Method of Closeable called on T and works fine too.
    }
}

Remarque:

Vous ne pouvez pas lier le paramètre générique à l'un des types utilisant la clause OR ( | ). Seule la clause AND ( & ) est prise en charge. Le type générique ne peut étendre qu'une classe et de nombreuses interfaces. La classe doit être placée au début de la liste.