【发布时间】: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<Number>?
【问题讨论】: