为什么 Optional.map 使此作业有效?

2022-09-01 06:11:31
Optional<ArrayList<String>> option = Optional.of(new ArrayList<>());

Optional<ArrayList<?>> doesntWork = option;

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

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


答案 1

如果您查看代码并遵循所有方法调用,您将看到最终返回 .因此,您可以将上一个作业替换为: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)

答案 2

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

 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>


推荐