Java Language Déclaration d'une méthode générique


Exemple

Les méthodes peuvent aussi avoir des paramètres de type génériques .

public class Example {

    // The type parameter T is scoped to the method
    // and is independent of type parameters of other methods.
    public <T> List<T> makeList(T t1, T t2) {
        List<T> result = new ArrayList<T>();
        result.add(t1);
        result.add(t2);
        return result;
    }

    public void usage() {
        List<String> listString = makeList("Jeff", "Atwood");
        List<Integer> listInteger = makeList(1, 2);
    }
}

Notez que nous n'avons pas à transmettre un argument de type réel à une méthode générique. Le compilateur déduit l'argument de type pour nous, en fonction du type de cible (par exemple, la variable à laquelle nous attribuons le résultat) ou des types d'arguments réels. Il infère généralement l'argument de type le plus spécifique qui rendra le type d'appel correct.

Parfois, bien que rarement, il peut être nécessaire de remplacer cette inférence de type par des arguments de type explicites:

void usage() {
    consumeObjects(this.<Object>makeList("Jeff", "Atwood").stream());
}

void consumeObjects(Stream<Object> stream) { ... }

Il est nécessaire dans cet exemple parce que le compilateur ne peut pas "regarder en avant" pour voir que Object est désiré pour T après avoir appelé stream() et que cela impliquerait autrement String basé sur les arguments makeList . Notez que le langage Java ne supporte pas omettre la classe ou de l' objet sur lequel la méthode est appelée ( this dans l'exemple ci - dessus) lorsque des arguments de type sont explicitement prévus.