[英]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.