我不明白为什么原始类型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::isInstance
投射到Predicate
:
List<Number> numbers1 = objectList.stream()
.filter((Predicate) Number.class::isInstance)
.map(Number.class::cast)
.collect(Collectors.toList());
这会导致编译错误:
错误:(28,25)java:不兼容的类型:java.lang.Object不能 转换为java.util.List
在filter
操作.map(Number.class::cast)
和.collect(Collectors.toList());
之后有一个演员,但最终的类型是java.lang.Object
。为什么您认为结果类型是java.lang.Object
而不是List<Number>
?
答案 0 :(得分:2)
filter
提供原始类型时,它会返回原始Stream
。map
为<R> Stream<R> Stream<T>::map(Function<? super T, ?
super R> function)
。但现在没有T
,因此该参数被强制为原始Function
类型,因此map
也会返回原始Stream
。collect
会返回Object
。