2014-05-21 20 views
12

考虑下面的代码片段为什么`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[]::newapply(int)给出Double[],而不是Object[],但如果使用上述不正确的方式会抛出ArrayStoreException)?

如果在不更改toArray调用中给定IntFunction的情况下更改流的类型,那么生成编译时错误的最佳方法是什么?

回答

9

方法Stream::toArray的签名如下所示。请注意,类型参数TA完全无关。

public interface Stream<T> { 
    <A> A[] toArray(IntFunction<A[]> generator); 
} 

ReferencePipeline.java源,你可以找到以下注释:

由于A没有任何关系U(不可能宣布A是一个上限的U) 会有不是静态类型检查。 因此,使用原始类型并假设为A == U,而不是在整个代码库中传播分隔AU 。 从不检查运行时类型U与运行类型A[]的组件类型是否相等。 当元素存储在A[]中时将执行运行时检查,因此如果A不是 超类型U将会抛出ArrayStoreException

+0

这是“超级T”会有帮助的情况之一吗?如果是这样,那么很有趣的是,他们还没有解决这个问题,因为它对于我来说似乎是一个“必须”,如果它在这样一个API中。 – skiwi

+0

那么,正如你指出的那样,我正在寻找它们完全不相关的原因。把一个''看起来很容易。因此,我期望在Stream接口的实现中会遇到一些问题或者类似的问题。 – muued

相关问题