为什么会导致编译错误:
Optional<Optional<Integer>> a = Optional.of(Optional.of(1));
Optional<Optional<? extends Number>> b = a;
Run Code Online (Sandbox Code Playgroud)
而以下不是?:
Optional<Optional<Integer>> a = Optional.of(Optional.of(1));
Optional<Optional<? extends Number>> c = a.map(x->x);
Run Code Online (Sandbox Code Playgroud)
虽然Optional<Integer>是 的 sybtype Optional<? extends Number>,Optional<Optional<Integer>>但不是 的子类型Optional<Optional<? extends Number>>。如果您尝试分配给 ,即使 extends ,您也会得到相同Optional<Integer>的Optional<Number>编译Integer错误Number。
为了更好地理解它,请将Optional<Integer>whithX和替换Optional<? extends Number>为Y。你会得到:
Optional<X> a = Optional.of(...);
Optional<Y> b = a;
Run Code Online (Sandbox Code Playgroud)
X是 的子类型Y,但Optional<X>不是 的子类型Optional<Y>,它是 的子类型Optional<? extends Y>
事实证明这Optional<Optional<Integer>>是 的子类型Optional<? extends Optional<? extends Number>>。
现在考虑第二种情况:
Optional<Optional<Integer>> a = Optional.of(Optional.of(1));
Optional<Optional<? extends Number>> c = a.map(x->x);
Run Code Online (Sandbox Code Playgroud)
map在这里,编译器看到should的结果Optional<Optional<? extends Number>>,并尝试在方法中推断出该类型map。所以映射器函数
Function<? super T, ? extends U> mapper
Run Code Online (Sandbox Code Playgroud)
变成
Function<? super Optional<Integer>, ? extends Optional<? extends Number>>
Run Code Online (Sandbox Code Playgroud)
因为map返回Optional<U>,U在我们的例子中被推断为Optional<? extends Number>
并map返回我们所需要的内容:
Optional<? extends Optional<? extends Number>>
Run Code Online (Sandbox Code Playgroud)
所以回答你的评论
提供了哪些新信息
.map(x -> x)?
.map(x -> x)帮助编译器推断正确的类型
有用的资源:
| 归档时间: |
|
| 查看次数: |
177 次 |
| 最近记录: |