我知道什么是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));
}
}
}
可以搜索 泛型的协变和逆变(感谢题主的问题,让我又复习了一下这里…)
不用通配符直接写死的话会造成一些不便,以
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: