声明一个通用方法

方法也可以具有泛型类型参数。

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

请注意,我们不必将实际类型参数传递给泛型方法。编译器根据目标类型(例如我们将结果赋给的变量)或实际参数的类型推断出我们的类型参数。它通常会推断出使调用类型更正的最具体的类型参数。

有时,虽然很少,但可能需要使用显式类型参数覆盖此类型推断:

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

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

在这个例子中是必要的,因为在调用 stream() 之后编译器不能向前看Object 是否需要 T,否则它将根据 makeList 参数推断 String。请注意,当显式提供类型参数时,Java 语言不支持省略调用该方法的类或对象(在上例中为 this)。