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

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

你能解釋一下為什么第一個展開的方法引用不能編譯嗎?

你能解釋一下為什么第一個展開的方法引用不能編譯嗎?

ibeautiful 2022-07-06 18:41:53
在這個例子中,傳遞一個方法引用Stream.of是行不通的,但是一旦它被包裝它就可以工作了。我不明白為什么會這樣。方法引用不等同于功能接口嗎?public class A {    String a() {        return "";    }    void b() {        Stream.of(this::a); // won't compile        Stream.of(wrap(this::a)); // will compile    }    static <T> Supplier<T> wrap(Supplier<T> f) {        return f;    }}
查看完整描述

3 回答

?
桃花長相依

TA貢獻1860條經(jīng)驗 獲得超8個贊

Stream.of(T)期望 anObject并且您在第一條語句中將方法引用傳遞給它。但是Object參數(shù)不是函數(shù)式接口,因此它不能接受方法引用或未明確鍵入的 lambda。
使用 lambda,它也會產(chǎn)生一個錯誤:Stream.of(()->this.a())
一個更簡單的例子可能是 Stream.of(()-> "foo")它不會編譯。

但是,如果您鍵入方法引用或 lambda,它會起作用:

Stream.of((Supplier<String>) this::a)

或者

Stream.of((Supplier<String>) () -> this.a())

在工作語句中,您傳遞給Stream.of(T)一個參數(shù)是Supplier<String>. 它指的是一個功能接口,但它的類型與前面的工作示例一樣,因此它作為需要Object.


查看完整回答
反對 回復(fù) 2022-07-06
?
哆啦的時光機

TA貢獻1779條經(jīng)驗 獲得超6個贊

this::a是無上下文的,可能意味著不同的東西。您需要提供一些上下文來幫助編譯器弄清楚您的實際意思this::a。


Stream.<Supplier<String>>of(this::a);

不過,這Stream<Supplier<String>>似乎不是你想要的。如果您需要 a Stream<String>,請使用Stream.generate: 不需要額外的類型信息,因為該方法采用 a Supplier<T>(這里沒有歧義)。


Stream.generate(this::a);

附帶說明一下,這兩個語句都希望您將它們的結(jié)果保存到變量中。定義正確類型的變量通常有助于解決此類問題。


Stream<Supplier<String>> s1 = Stream.of(this::a);

Stream<String> s2 = Stream.generate(this::a);

感謝@J-Alex 和@Holger 的寶貴評論。


查看完整回答
反對 回復(fù) 2022-07-06
?
皈依舞

TA貢獻1851條經(jīng)驗 獲得超3個贊

Stream.of具有以下簽名:


public static<T> Stream<T> of(T t)

以下示例將編譯,因為您明確提供了T.


Stream<Supplier<String>> a = Stream.of(this::a);

第一個示例Stream.of(this::a);相當(dāng)于:


Object a = this::a;

whereObject不是功能接口,不會編譯。


提供一個功能接口,這個例子編譯:


Runnable a = this::a;

Stream.of(a);

在第二個例子中,wrap提供了一個功能接口Supplier


查看完整回答
反對 回復(fù) 2022-07-06
  • 3 回答
  • 0 關(guān)注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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