以下两个方法声明之间有什么区别:
1. <R> Stream<R> myFunc(Function<? super T, ? extends R> mapper);
2. Stream<R> myFunc(Function<? super T, ? extends R> mapper);
为了编译第二个声明,我需要向此类添加类型参数。
public class MyGenericsTest<T, R>
在这种情况下,编译器将确保在编译时确定myFunc的返回类型。编译器也可以从方法签名中得知这一点。我对为什么编译器将这两个声明区别对待感到困惑。
通过编写,<R> Stream<R> myFunc(Function<? super T, ? extends R> mapper)
您告诉编译器:
R
是任何类,并且是方法的局部变量(以开头<R>
开头)Stream
的R
T
是在的type参数中指定的类MyGenericsTest<T>
(如果您不指定它,它将无法工作,因为编译器将不知道T
)如果更改为Stream<R> myFunc(Function<? super T, ? extends R> mapper)
,R
并且T
不是局部的(<R, T>
在方法的开始处为否),并且编译器希望它们在类级别定义为MyGenericsTest<T, R>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句