为什么可选地图使此分配有效?

Optional<ArrayList<String>> option = Optional.of(new ArrayList<>());

Optional<ArrayList<?>> doesntWork = option;

Optional<ArrayList<?>> works = option.map(list -> list);

第一个尝试的赋值不会编译,但第二个尝试的赋值会编译。感觉实际上不应该完成任何事情,但由于某种原因,它把我的变成了一个.有没有某种隐含的演员阵容?mapmapOptional<ArrayList<String>>Optional<ArrayList<?>>


蛊毒传说
浏览 74回答 4
4回答

临摹微笑

如果您查看并遵循所有方法调用的代码,您会发现它最终会返回 。因此,您可以将上一个作业替换为:mapoption.map(list -> list)new Optional<>(option.get())Optional<ArrayList<?>>&nbsp;works&nbsp;=&nbsp;new&nbsp;Optional<>(option.get());这将创建一个新的变量,并用 返回的 来初始化其实例变量(其类型为 )。这是一个有效的分配。Optional<ArrayList<?>>valueArrayList<?>ArrayList<String>map.get()有没有某种隐含的演员阵容?否,返回新实例。它不会强制转换调用它的原始实例。mapOptional下面是方法调用链:option.map(list&nbsp;->&nbsp;list)返回 (因为 不为空)optionOptional.ofNullable(mapper.apply(value))在您的情况下与Optional.ofNullable(value)返回(因为值不为空):Optional.of(value)返回new&nbsp;Optional<>(value)

慕哥9229398

好吧,第一个不起作用,因为泛型是不变的,使它们协变的唯一方法是添加一个有界类型,例如:&nbsp;Optional<? extends ArrayList<String>> doesntWork = option;&nbsp;这将编译。当你说这个步骤不应该完成任何事情时,这是好的,不正确的。看看的定义:mapOptional::mappublic <U> Optional<U> map(Function<? super T, ? extends U> mapper) {&nbsp; &nbsp; Objects.requireNonNull(mapper);&nbsp; &nbsp; if (!isPresent()) {&nbsp; &nbsp; &nbsp; &nbsp; return empty();&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; return Optional.ofNullable(mapper.apply(value));&nbsp; &nbsp; }}粗略地说,它确实从转换为...Optional<T>Optional<U>

隔江千里

在后一种情况下,方法的返回类型由变量的类型隐式确定。这就是存在差异的原因。Optional.mapworks

Cats萌萌

您的签名option.map<ArrayList<?>>&nbsp;Optional<ArrayList<?>>&nbsp;java.util.Optional.map(Function<?&nbsp;super&nbsp;ArrayList<String>,&nbsp;?&nbsp;extends&nbsp;ArrayList<?>>&nbsp;mapper)所以这个Optional<?&nbsp;extends&nbsp;ArrayList<?>>&nbsp;doesntWork&nbsp;=&nbsp;option;编译。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java