原始类型谓词导致编译错误

时间:2017-12-02 19:06:33

标签: java predicate

我不明白为什么原始类型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>

1 个答案:

答案 0 :(得分:2)

  1. 当您向filter提供原始类型时,它会返回原始Stream
  2. 通常,map<R> Stream<R> Stream<T>::map(Function<? super T, ? super R> function)。但现在没有T,因此该参数被强制为原始Function类型,因此map也会返回原始Stream
  3. 类似逻辑意味着collect会返回Object