![](/img/trans.png)
[英]Java weird compilation error with raw generic type parameter and Optionals
[英]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());
这会导致编译错误:
错误:(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>
?
filter
的原始类型,因此它返回原始Stream
。 map
将是<R> Stream<R> Stream<T>::map(Function<? super T, ? super R> function)
。 但是现在没有T
,因此该参数被强制为原始Function
类型,因此map
也会返回原始Stream
。 collect
返回一个Object
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.