簡體   English   中英

為什么Optional.map使這個賦值工作?

[英]Why does Optional.map make this assignment work?

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

Optional<ArrayList<?>> doesntWork = option;

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

第一次嘗試的轉讓不能編譯,但第二個與map一樣。 感覺map不應該實際完成任何事情,但由於某種原因它將我的Optional<ArrayList<String>>變成Optional<ArrayList<?>> 是否存在某種隱式演員?

如果你查看map的代碼並按照所有的方法調用,你會看到option.map(list -> list)最終返回new Optional<>(option.get()) 所以您可以用以下內容替換上一個作業:

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

這將創建一個新的Optional<ArrayList<?>>並使用map.get()返回的ArrayList<String>初始化其value實例變量(其類型為ArrayList<?> map.get() 這是一項有效的作業。

是否存在某種隱式演員?

不, map返回一個新的Optional實例。 它不會轉換調用它的原始實例。

這是方法調用鏈:

option.map(list -> list)

返回(因為option不為空)

Optional.ofNullable(mapper.apply(value))

在你的情況下是相同的

Optional.ofNullable(value)

返回(因為值不為null):

Optional.of(value)

返回

new Optional<>(value)

那么第一個不起作用,因為泛型是不變的,使它們協變的唯一方法是添加有界類型,例如:

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

那會編譯。

當你說map步驟不應該完成任何事情是好的,不正確。 看看Optional::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> ......

您的option.map具有簽名

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

所以這

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

編譯。

在后一種情況下, Optional.map方法的返回類型由works變量的類型隱式確定。 這就是為什么會有所不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM