原始类型谓词导致编译错误
我不明白为什么原始类型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
:
这就导致了一个编译错误:
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>
?
回答:
- 正如您提供的原始类型为
filter
,它将返回原始的Stream
。 - 通常,
map
将是<R> Stream<R> Stream<T>::map(Function<? super T, ? super R> function)
。但是现在没有T
,所以参数被强制为Function
类型,所以map
也最终返回原始的Stream
。 - 类似的逻辑意味着
collect
返回Object
。
以上是 原始类型谓词导致编译错误 的全部内容, 来源链接: utcz.com/qa/257827.html