与类型绑定的嵌套泛型导致编译错误
为什么会导致编译错误:
Optional<Optional<Integer>> a = Optional.of(Optional.of(1));
Optional<Optional<? extends Number>> b = a;
而以下不?
Optional<Optional<Integer>> a = Optional.of(Optional.of(1));
Optional<Optional<? extends Number>> c = a.map(x->x);
尽管Optional<Integer>
是Optional<? extends Number>
的sybtype Optional<? extends Number>
Optional<? extends Number>
, Optional<Optional<Integer>>
不是Optional<Optional<? extends Number>>
的子类型Optional<Optional<? extends Number>>
Optional<Optional<? extends Number>>
。 如果尝试将Optional<Integer>
赋予Optional<Number>
,即使Integer
扩展了Number
,也会得到相同的编译错误。
要更好地理解它,请将Optional<Integer>
替换为X
和Optional<? extends Number>
用Y
Optional<? extends Number>
。 你会得到:
Optional<X> a = Optional.of(...);
Optional<Y> b = a;
X
是Y
的子类型,但Optional<X>
不是Optional<Y>
的子类型,它是Optional<? extends Y>
Optional<Y>
的子类型Optional<? extends Y>
Optional<? extends Y>
原来, Optional<Optional<Integer>>
是Optional<? extends Optional<? extends Number>>
的子类型Optional<? extends Optional<? extends Number>>
Optional<? extends Optional<? extends Number>>
Optional<? extends Optional<? extends Number>>
。
现在考虑第二种情况:
Optional<Optional<Integer>> a = Optional.of(Optional.of(1));
Optional<Optional<? extends Number>> c = a.map(x->x);
这里编译器认为map
的结果应该是Optional<Optional<? extends Number>>
Optional<Optional<? extends Number>>
并尝试在map
方法中推断该类型。 所以映射函数
Function<? super T, ? extends U> mapper
变
Function<? super Optional<Integer>, ? extends Optional<? extends Number>>
因为map
在我们的例子中返回Optional<U>
, U
被推断为Optional<? extends Number>
Optional<? extends Number>
而map
正是我们所需要的:
Optional<? extends Optional<? extends Number>>
所以回答你的评论
.map(x -> x)
提供了哪些新信息?
.map(x -> x)
帮助编译器推断正确的类型
有用的资源:
通配符和子类型
类型推断
Optional<Optional<Integer>> a = Optional.of(Optional.of(1));
//Here the compiler can't infer that you have an Optional<? extends Number>
Optional<Optional<? extends Number>> b = a;
//This would be the correct syntax
Optional<? extends Optional<? extends Number>> b = a;
//Here the map takes a parameter
//Function<? extends Optional<Integer>, Optional<? extends Number>>
//the return value of map is exactly the type that the variable is expecting
Optional<Optional<? extends Number>> c = a.map(x->x);
链接地址: http://www.djcxy.com/p/41371.html
上一篇: Nested generic with type bound results in compile error
下一篇: IE is not sending Client certificate in TLS mutual authentication