第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么 Optional 的 or 和 flatMap 方法的供應(yīng)商類型參數(shù)是通配符?

為什么 Optional 的 or 和 flatMap 方法的供應(yīng)商類型參數(shù)是通配符?

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

3 回答

?
守候你守候我

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊

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

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

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

 Function<..., Optional<StringBuilder>>

不是的子類型

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

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

 Function<..., Optional<StringBuilder>>

是一個(gè)子類型

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


查看完整回答
反對(duì) 回復(fù) 2022-03-10
?
暮色呼如

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個(gè)贊

FWIW,在 Java 11 中的Stream.iterate和Stream.iterate中仍然存在與協(xié)變參數(shù)類似的問題。當(dāng)前的方法簽名是


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 組合,例如,以下內(nèi)容無法編譯:


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相比, 這是“附加類型參數(shù)方法”實(shí)際起作用的情況。


查看完整回答
反對(duì) 回復(fù) 2022-03-10
?
郎朗坤

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊

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


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


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

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


right = left; // will compile

或分配Function給另一個(gè)


查看完整回答
反對(duì) 回復(fù) 2022-03-10
  • 3 回答
  • 0 關(guān)注
  • 159 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)