在学习stream的collect方法,尝试使用System.out.println直接输出collect的返回值时,会发生报错
public static void main(String[] args) {
List<String> sArr = Arrays.asList("1", "2", "3", "17", "4", "4", "78");
System.out.println(sArr.stream().collect(Collectors.toCollection(ArrayList::new)));
}
错误显示是这样的,不止为何调用的是参数为String的println方法
运行后报错如图
java:小兼容的类型:inferencevariableRhasincompatiblebounds
upperbounds:java.lang.string,java.util.Collection<T>,java.lang.object
lower bounds: java.util.ArrayList<E>
如果先使用一个Collection对象接收collect的返回值,在使用println可以正常输出
而使用alt+enter自动修改后在collect的参数前加了个强制类型转换(Collector<? super String, Object, ArrayList>),代码变成了这样,就可以运行了
public static void main(String[] args) {
List<String> sArr = Arrays.asList("1", "2", "3", "17", "4", "4", "78");
System.out.println(sArr.stream().collect((Collector<? super String, Object, ArrayList<Object>>) Collectors.toCollection(ArrayList::new)));
}
所以这到底是为啥println不能直接输出,collect不是返回了一个ArrayList对象吗?为何不能直接输出呢?
ArrayList::new 并没有指定泛型
你如果只是想转换成List完全可以直接用 Collectors.toList