为什么会导致编译错误:
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 次 |
最近记录: |