亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 Optional 的 or 和 flatMap 方法的供應商類型參數是通配符?

為什么 Optional 的 or 和 flatMap 方法的供應商類型參數是通配符?

千萬里不及你 2022-03-10 10:31:05
該Optional.or方法是在 Java 9 中添加的。這是方法簽名public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)既然是final類,為什么是Suppliertake的類型參數? extends Optional而不是just ?OptionalOptional該Optional.flatMap方法也是如此。這是對 Java 8 的更改。在 Java 8 中,它在 Java 9 中Function<? super T, Optional<U>> mapper被更改為Function<? super T,? extends Optional<? extends U>>。
查看完整描述

3 回答

?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

我從 Stuart Marks 本人那里找到了背后的原因

http://mail.openjdk.java.net/pipermail/core-libs-dev/2016-October/044026.html

這與嵌套泛型(Optional嵌套在內部Function)有關。從郵件線程

 Function<..., Optional<StringBuilder>>

不是的子類型

 Function<..., Optional<? extends CharSequence>>

為了解決這個問題,我們還必須添加外部通配符,這樣

 Function<..., Optional<StringBuilder>>

是一個子類型

 Function<..., ? extends Optional<? extends CharSequence>>


查看完整回答
反對 回復 2022-03-10
?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

FWIW,在 Java 11 中的Stream.iterate和Stream.iterate中仍然存在與協變參數類似的問題。當前的方法簽名是


static <T> Stream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next)

static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)

這些簽名不允許某些UnaryOperator從類型角度來看合理的種子和 s 組合,例如,以下內容無法編譯:


UnaryOperator<String> op = s -> s; 

Stream<CharSequence> scs = iterate("", op); // error

建議的解決方案是將方法簽名更改為


static <T, S extends T> Stream<T> iterate(S seed, Predicate<? super S> hasNext, UnaryOperator<S> next)

static <T, S extends T> Stream<T> iterate(S seed, UnaryOperator<S> f)

因此,與Optional.or和Optional.flatMap相比, 這是“附加類型參數方法”實際起作用的情況。


查看完整回答
反對 回復 2022-03-10
?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

是的...據說帶有extends-bound(上限)的通配符使類型 covariant,這意味著例如List<Apple>是List<? extends Fruit>(考慮到Appleextends Fruit)的實際子類型;這也稱為協方差。


或者在您展示的示例中,這意味著它Optional<StringBuilder>是 的子類型Optional<? extends Optional<? extends CharSequence>>,因此您可以例如執行以下操作:


List<Optional<String>> left = new ArrayList<>();

List<? extends Optional<? extends CharSequence>> right = new ArrayList<>();


right = left; // will compile

或分配Function給另一個


查看完整回答
反對 回復 2022-03-10
  • 3 回答
  • 0 關注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號