繁体   English   中英

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

[英]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::isInstancePredicate

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());之后有一个.map(Number.class::cast) .collect(Collectors.toList()); 但最终的类型是java.lang.Object 为什么您认为结果类型是java.lang.Object而不是List<Number>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM