返回泛型类型,何时使用 <T>returnType<T> 以及何时只使用 returnType<T>?

use*_*587 0 java generics return-type

在泛型api中,为什么有时类型参数写在返回类型之前,有时不需要?

以以下两个 Steam API 为例

Stream<T>   limit(long maxSize)
Run Code Online (Sandbox Code Playgroud)

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

为什么Stream.limit的返回类型只能写为Stream<T>但不能<T> Stream<T>

何时使用<T> returnType <T>,何时使用returnType<T>

Tur*_*g85 5

T一个示例中的泛型参数Stream是正在操作的参数,因此limit(...)返回一个新Stream的与调用的流相同的泛型类型limit(...)

在第二个例子中,结果的泛型类型Stream可能会改变,因此需要一个单独的泛型参数。在这种情况下,结果的类型Streammapper-lambda 的影响。例如,如果Persons 映射到它们的SocialSecurityNumber,那么初始值Stream将是 a Stream<Person>, themapper将是类型Function<Person, SocialSecurityNumber>,结果Stream将是 a Stream<SocialSecurityNumber>