2017-12-02 16 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. 同様のロジックは、collectObjectを返すことを意味します。
関連する問題