以下两个方法声明之间有什么区别:
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的返回类型.编译器也可以从方法签名中知道.我很困惑为什么这两个声明被编译器区别对待.
通过编写,<R> Stream<R> myFunc(Function<? super T, ? extends R> mapper)你告诉编译器:
R是任何类,并且是方法的本地(通过从头<R>开始)Stream的RTMyGenericsTest<T>(在你没有指定的情况下,它是一个在类型参数中指定的类,它不会工作,因为编译器不会知道T)如果您更改为Stream<R> myFunc(Function<? super T, ? extends R> mapper),R而T不是本地(<R, T>在方法的开头没有),并且编译器期望它们在类级别定义为MyGenericsTest<T, R>