java泛型方法签名

Jul*_*oud 4 java generics

我对泛型方法的语法有点困惑。读完这篇文章后我的理解是通用方法应该这样声明:

public static <E> void printArray( E[] inputArray )
Run Code Online (Sandbox Code Playgroud)

作为<E>占位符,告知 E 是泛型类型

那么为什么我会在javadoc中找到这样的内容:

Stream<T> filter(Predicate<? super T> predicate)
Run Code Online (Sandbox Code Playgroud)

没有占位符?我本来期望

<T> Stream<T> filter(Predicate<? super T> predicate)
Run Code Online (Sandbox Code Playgroud)

以及为什么

<R> Stream<R> map(Function<? super T,? extends R> mapper)
Run Code Online (Sandbox Code Playgroud)

这次有一个占位符,但只用于 R,不用于 T。为什么?

Lou*_*man 5

这些方法是在接口上定义的实例方法,它定义了类型Stream的类型参数:

public interface Stream<T> {
  Stream<T> filter(Predicate<? super T>)
}
Run Code Online (Sandbox Code Playgroud)

...因此类型参数是在接口上定义的,而不是在方法上定义的。

正如您所注意到的map.