【发布时间】:2019-06-04 15:21:56
【问题描述】:
我不是 Java 8 的新手,我知道流是一种非常强大、方便的数据处理方式,而且我经常使用它们。事实上,我正在使用流进行更复杂的数据处理而没有任何问题,但是看看这个?它看起来很基本的处理,但是类型擦除存在问题。为什么它不能处理这样的数据收集?
Set[] arrOfSets = {new TreeSet<>(List.of(1, 2)), new LinkedHashSet<>(Arrays.asList(1, 2, 3, null))};
/*why type erasure wins here? */
List<Number> collect = (List<Number>) Arrays.stream(arrOfSets).flatMap(Set::Stream).collect(Collectors.toList());
Object collect2 = Arrays.stream(arrOfSets).flatMap(set -> set.stream()).collect(Collectors.toList());
System.out.println("Collect2:" + collect2); /*[1, 2, 1, 2, 3, null]*/
/*Here type interference works fine*/
List<Integer> collect1 = new TreeSet<>(Arrays.asList(1, 2, 3)).stream().collect(Collectors.toList());
System.out.println(collect2.getClass().getSimpleName()); //ArrayList
与List<Set>相同:
List<?> collect3 = listOfSets.stream().flatMap(Set::stream).collect(Collectors.toList());
运行时异常:java:不兼容类型:java.lang.Object 无法转换为 java.util.List
我觉得这是流的巨大缺点。在未来的 sdk 中是否有机会改善 Streams API 中的类型干扰,或者没有办法克服这个问题?
【问题讨论】:
-
Set[] arrOfSets- 你已经打破了类型推断,Sets 包含什么通用数据类型?而且您可能想使用Set::stream而不是Set::Stream,对吧?
标签: java generics java-stream type-inference type-erasure