考虑下面的代码片段为什么`Stream.collect`类型安全并且`Stream.toArray(IntFunction <A[]>)`不是?
String strings[] = {"test"};
final List<String> collect = java.util.Arrays.stream(strings).collect(java.util.stream.Collectors.toList());
final Double[] array = java.util.Arrays.stream(strings).toArray(Double[]::new);
的Java为什么能保证在收集情况的正确类型(改变泛型类型的收集到例如双导致编译时错误),但不是在阵列情况(编译正常,尽管Double[]::new
的apply(int)
给出Double[]
,而不是Object[]
,但如果使用上述不正确的方式会抛出ArrayStoreException)?
如果在不更改toArray调用中给定IntFunction的情况下更改流的类型,那么生成编译时错误的最佳方法是什么?
这是“超级T”会有帮助的情况之一吗?如果是这样,那么很有趣的是,他们还没有解决这个问题,因为它对于我来说似乎是一个“必须”,如果它在这样一个API中。 – skiwi
那么,正如你指出的那样,我正在寻找它们完全不相关的原因。把一个''看起来很容易。因此,我期望在Stream接口的实现中会遇到一些问题或者类似的问题。 – muued
@ muued请注意'''*在语法上*不可能在类型声明中使用。你只能有'?超级T“作为一种类型,但你无法捕捉到'?'。这与'X extends T'可以捕获''相反。延伸T'。它在创建泛型时从Java中被省略,因为它被认为*不够有用*。 – skiwi