考虑以下代码片段
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可以保证collect-case中的正确类型(将collect的泛型类型更改为例如Double导致编译时错误),但不在数组的情况下(编译正常,尽管apply(int)
为Double[]::new
代码为Double[]
,而不是Object[]
,但如果上面使用不正确,会引发ArrayStoreException
?
如果在不更改IntFunction
调用中的给定toArray
的情况下更改流的类型,生成编译时错误的最佳方法是什么?
答案 0 :(得分:12)
方法Stream::toArray
的签名如下所示。请注意,类型参数T
和A
完全不相关。
public interface Stream<T> {
<A> A[] toArray(IntFunction<A[]> generator);
}
在ReferencePipeline.java的来源中,您可以找到以下评论:
由于
A
与U
无关(无法声明A
是U
的上限) 没有静态类型检查。 因此,使用原始类型并假设A == U
而不是传播A
和U
的分隔 整个代码库。 永远不会检查U
的运行时类型是否与运行时类型A[]
的组件类型相等。 当元素存储在A[]
中时,将执行运行时检查,因此如果A
不是a 1}}和U
的超级类型将被抛出。