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
.

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 的寶貴評論。

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
添加回答
舉報