与类型绑定的嵌套泛型导致编译错误
为什么会导致编译错误:
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
