带有类型绑定的嵌套泛型会导致编译错误

Rik*_*Rik 7 java generics

为什么会导致编译错误:

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)

Kir*_*nov 2

虽然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)帮助编译器推断正确的类型

有用的资源: