与类型绑定的嵌套泛型导致编译错误

为什么会导致编译错误:

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>替换为XOptional<? extends Number>Y Optional<? extends Number> 。 你会得到:

Optional<X> a = Optional.of(...);
Optional<Y> b = a;

XY的子类型,但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