考慮下面的代碼片段爲什麼`Stream.collect`類型安全並且`Stream.toArray(IntFunction <A[]>)`不是?
String strings[] = {"test"};
final List<String> collect = java.util.Arrays.stream(strings).collect(java.util.stream.Collectors.toList());
final Double[] array = java.util.Arrays.stream(strings).toArray(Double[]::new);
的Java爲什麼能保證在收集情況的正確類型(改變泛型類型的收集到例如雙導致編譯時錯誤),但不是在陣列情況(編譯正常,儘管Double[]::new
的apply(int)
給出Double[]
,而不是Object[]
,但如果使用上述不正確的方式會拋出ArrayStoreException)?
如果在不更改toArray調用中給定IntFunction的情況下更改流的類型,那麼生成編譯時錯誤的最佳方法是什麼?
這是「超級T」會有幫助的情況之一嗎?如果是這樣,那麼很有趣的是,他們還沒有解決這個問題,因爲它對於我來說似乎是一個「必須」,如果它在這樣一個API中。 – skiwi
那麼,正如你指出的那樣,我正在尋找它們完全不相關的原因。把一個''看起來很容易。因此,我期望在Stream接口的實現中會遇到一些問題或者類似的問題。 – muued
@ muued請注意'''*在語法上*不可能在類型聲明中使用。你只能有'?超級T「作爲一種類型,但你無法捕捉到'?'。這與'X extends T'可以捕獲''相反。延伸T'。它在創建泛型時從Java中被省略,因爲它被認爲*不夠有用*。 – skiwi