Java 8可选版本中flatMap的签名
在oracle docs中,它似乎是
<U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)
对于mapper
作为Function
,它使参数反变,但不使返回类型协变。我想知道mapper
是否可以(应该)被删除
Function<? super T,Optional<? extends U>>
或者
Function<? super T, ? extends Optional<? extends U>>
?
# 1 楼答案
首先,在我看来,由于
U
绑定到方法本身,而不是类Optional
,而且Optional
是final
,所以当前签名应该可以正常工作如果上述两个条件中的任何一个不成立,则可以应用更改。感谢@MalteHartwig提供的link。让我总结一下这个问题的答案。很明显,如果返回类型需要是协变的,Java 8中就需要后一个签名(较长的)。这不仅仅是关于继承^在}来声明
Optional<? extends U>
前面需要{Function
的用户站点方差,即使Optional
是final
。我制作了一段代码片段来演示:似乎因为Java只有用户站点差异声明,所以您可能需要一系列
? extends
将该声明从要声明差异的类型变量一直传播到(第二)最外层# 2 楼答案
假设你有
class A
和class B extends A
;你需要记住一个对象B
是一个A
对象;你继承了它为了使对象满足
Optional<? extends U>
约束,它必须满足Optional<U>
约束。同样,为了让对象满足Optional<U>
约束,它必须满足Optional<? extends U>
在这种情况下,它们是同义词
虽然这个问题是特定于某个方法的,但你可以很容易地测试答案。通过编写一个类似的函数,您可以测试编译器是否允许您想要的内容,以及它是否会按预期运行
正如所料,一切都很好