【问题标题】:Raw type predicate causes compilation error原始类型谓词导致编译错误
【发布时间】:2018-05-16 15:03:22
【问题描述】:

我不明白为什么即使我有类型转换,原始类型 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&lt;Number&gt;

【问题讨论】:

    标签: java predicate


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多