原始类型谓词导致编译错误
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>
?
- 当您向
filter
提供原始类型时,它 returns 是原始 Stream
.
- 通常,
map
会是 <R> Stream<R> Stream<T>::map(Function<? super T, ?
super R> function)
。但是现在没有 T
,所以参数被强制为原始 Function
类型,所以 map
也最终返回原始 Stream
.
- 类似的逻辑意味着
collect
returns 一个 Object
.
我不明白为什么即使我进行了类型转换,原始类型 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>
?
- 当您向
filter
提供原始类型时,它 returns 是原始Stream
. - 通常,
map
会是<R> Stream<R> Stream<T>::map(Function<? super T, ? super R> function)
。但是现在没有T
,所以参数被强制为原始Function
类型,所以map
也最终返回原始Stream
. - 类似的逻辑意味着
collect
returns 一个Object
.