Java Generics - 方法声明的区别

paw*_*pta 6 java generics

以下两个方法声明之间有什么区别:

 1. <R> Stream<R> myFunc(Function<? super T, ? extends R> mapper);    
 2. Stream<R> myFunc(Function<? super T, ? extends R> mapper);
Run Code Online (Sandbox Code Playgroud)

对于要编译的第二个声明,我需要像这样向类添加类型参数.

public class MyGenericsTest<T, R>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,编译器确保在编译时确定myFunc的返回类型.编译器也可以从方法签名中知道.我很困惑为什么这两个声明被编译器区别对待.

ort*_*tis 8

通过编写,<R> Stream<R> myFunc(Function<? super T, ? extends R> mapper)你告诉编译器:

  • R是任何类,并且是方法的本地(通过从头<R>开始)
  • 返回类型是StreamR
  • TMyGenericsTest<T>(在你没有指定的情况下,它是一个在类型参数中指定的类,它不会工作,因为编译器不会知道T)

如果您更改为Stream<R> myFunc(Function<? super T, ? extends R> mapper),RT不是本地(<R, T>在方法的开头没有),并且编译器期望它们在类级别定义为MyGenericsTest<T, R>