Java Language Dichiarazione di un metodo generico


Esempio

I metodi possono anche avere parametri di tipo generico .

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);
    }
}

Si noti che non è necessario passare un argomento di tipo effettivo a un metodo generico. Il compilatore deduce l'argomento tipo per noi, in base al tipo di destinazione (ad esempio, la variabile a cui assegniamo il risultato) o ai tipi degli argomenti effettivi. In genere inferirà l'argomento di tipo più specifico che renderà corretta la chiamata.

A volte, anche se raramente, può essere necessario sovrascrivere questo tipo di inferenza con argomenti di tipo esplicito:

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

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

È necessario in questo esempio perché il compilatore non può "guardare avanti" per vedere che l' Object è desiderato per T dopo aver chiamato stream() e altrimenti inferirebbe String basato sugli argomenti makeList . Si noti che il linguaggio Java non supporta l'omissione della classe o dell'oggetto su cui viene chiamato il metodo ( this nell'esempio precedente) quando vengono forniti esplicitamente argomenti tipo.