2017-12-02 63 views
2

我不明白爲什麼原始類型Predicate會導致編譯錯誤,即使我有一個類型轉換。我們來看下面的例子:原始類型謂詞導致編譯錯誤

從包含不同對象的列表中獲取延伸Number的列表,並將其轉換爲Number並收集到List

List<Object> objectList = Arrays.asList(1, 3.4, 2, new Object(), ""); 

List<Number> numbers = objectList 
     .stream() 
     .filter(Number.class::isInstance) 
     .map(Number.class::cast) 
     .collect(Collectors.toList()); 

讓我們做同樣的事情,但是這一次,讓我們投Number.class::isInstancePredicate

這就導致了一個編譯錯誤:

Error:(28, 25) java: incompatible types: java.lang.Object cannot be converted to java.util.List

有一個filter後獲得的鑄造操作.map(Number.class::cast).collect(Collectors.toList());但最終的類型是java.lang.Object。爲什麼你認爲結果類型是java.lang.Object而不是List<Number>

回答

1
  1. 正如您提供的原始類型爲filter,它將返回原始的Stream
  2. 通常,map將是<R> Stream<R> Stream<T>::map(Function<? super T, ? super R> function)。但是現在沒有T,所以參數被強制爲Function類型,所以map也最終返回原始的Stream
  3. 類似的邏輯意味着collect返回Object
相關問題