为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

蛊毒传说 2022-09-21 16:30:22
Optional<ArrayList<String>> option = Optional.of(new ArrayList<>());

Optional<ArrayList<?>> doesntWork = option;

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

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


查看完整描述

4 回答

?
临摹微笑

TA贡献1661条经验 获得超2个赞

如果您查看并遵循所有方法调用的代码,您会发现它最终会返回 。因此,您可以将上一个作业替换为:mapoption.map(list -> list)new Optional<>(option.get())

Optional<ArrayList<?>> works = new Optional<>(option.get());

这将创建一个新的变量,并用 返回的 来初始化其实例变量(其类型为 )。这是一个有效的分配。Optional<ArrayList<?>>valueArrayList<?>ArrayList<String>map.get()

有没有某种隐含的演员阵容?

否,返回新实例。它不会强制转换调用它的原始实例。mapOptional

下面是方法调用链:

option.map(list -> list)

返回 (因为 不为空)option

Optional.ofNullable(mapper.apply(value))

在您的情况下与

Optional.ofNullable(value)

返回(因为值不为空):

Optional.of(value)

返回

new Optional<>(value)


查看完整回答
反对 回复 2022-09-21
?
慕哥9229398

TA贡献1553条经验 获得超5个赞

好吧,第一个不起作用,因为泛型是不变的,使它们协变的唯一方法是添加一个有界类型,例如:


 Optional<? extends ArrayList<String>> doesntWork = option; 

这将编译。


当你说这个步骤不应该完成任何事情时,这是好的,不正确的。看看的定义:mapOptional::map


public <U> Optional<U> map(Function<? super T, ? extends U> mapper) {

    Objects.requireNonNull(mapper);

    if (!isPresent()) {

        return empty();

    } else {

        return Optional.ofNullable(mapper.apply(value));

    }

}

粗略地说,它确实从转换为...Optional<T>Optional<U>


查看完整回答
反对 回复 2022-09-21
?
隔江千里

TA贡献1561条经验 获得超10个赞

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



查看完整回答
反对 回复 2022-09-21
?
Cats萌萌

TA贡献1492条经验 获得超9个赞

您的签名option.map

<ArrayList<?>> Optional<ArrayList<?>> java.util.Optional.map(Function<? super ArrayList<String>, ? extends ArrayList<?>> mapper)

所以这个

Optional<? extends ArrayList<?>> doesntWork = option;

编译。


查看完整回答
反对 回复 2022-09-21

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信