extends U> 和 在元函数中有区别吗?
我知道什么是List<? extends Number>
, 但是下面<? extends U>
可以写成<U>
吗?
Java SE 8 Optional 源码:
public final class Optional<T> {
private final T value;
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Optional.ofNullable(mapper.apply(value));
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
可以搜索 泛型的协变和逆变(感谢题主的问题,让我又复习了一下这里…)
不用通配符直接写死的话会造成一些不便,以
Optional<String>
为例,对于<R> R map(Function<? super T, ? extend R)
这个方法:? super T
写死成T
,这里就只能传Function<String, X>
不能传Function<Object, X>
,即使Function<Object, X>
可以用String
做参数? extend R
写死成R
,这里传一个Function<X, String>
,那么就只能用Optaional<String>
来接,不能用Optional<Object>
接,因为类型不匹配附上一段demo:
这种写法具有更强的目的性和扩展性, 如果此泛型对此此类来说是消费者 可以用
? extends T
,如果是生产者,可以用? super T
,原因是泛型也不能百分之百确定就是某个class
,如果确定一定以及肯定,那么就可以直接用T