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

Raw type predicate causes compilation error

我不明白为什么即使我进行了类型转换,原始类型 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());

这会导致编译错误:

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. 当您向 filter 提供原始类型时,它 returns 是原始 Stream.
  2. 通常,map 会是 <R> Stream<R> Stream<T>::map(Function<? super T, ? super R> function)。但是现在没有 T,所以参数被强制为原始 Function 类型,所以 map 也最终返回原始 Stream.
  3. 类似的逻辑意味着 collect returns 一个 Object.