当前位置: 首页 > 面试题库 >

为什么`Stream.collect`是类型安全的,而`Stream.toArray(IntFunction)`不是吗?

李景天
2023-03-14
问题内容

考虑以下代码片段

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的为什么能保证在收集情况的正确类型(改变一个编译时错误的一般类型的收集到如双引线),但不是在阵列情况下(编译罚款,尽管apply(int)Double[]::new给出了一个Double[],而不是一个Object[],而是抛出ArrayStoreException如果如上所述使用不正确)?

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


问题答案:

该方法的签名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将被抛出。



 类似资料:
  • 在这种情况下,有人能帮助理解类型安全的含义吗? 我对Javadoc-https://docs . spring . io/spring-framework/docs/3 . 1 . 4 . release/Javadoc-API/org/spring framework/context/annotation/components can . html # base packages()的理解有些不

  • 问题内容: 为什么将类实现为常规类而不是将 抽象方法实现为 抽象 类。 会不会带来任何问题?或以这种方式有什么用吗? 而且,该方法应该是一种非常特定的方法, 其功能不能由任何其他类实现 (如果我没记错的话)。因此,我想该关键字比其他任何方法都更适合此操作。 但是我可以重写此方法并根据需要使用它, 它显然只印了, 有人告诉你我会产生一个新线程吗? 除了使工程师取代您感到困惑之外,还有什么其他用途?

  • 问题内容: 我对Python 3中的和类有些困惑。也许有人可以消除我的困惑或提供一些其他信息。 我目前的理解是,每个类(除外)都从称为的基类继承。但是每个类(包括)也是该类的一个实例,它是自身的实例,并且也从继承。 我的问题是: 是否有一个原因/设计决策,为什么是的实例并从中继承?对象的/ class是否也可以是对象本身? 类()如何成为其自身的实例? 哪一个是真正的基类或? 我一直认为这将是最“

  • 问题内容: 请用代码示例说明为什么SimpleDateFormat不是线程安全的。这节课有什么问题? 是SimpleDateFormat的格式功能问题吗?请提供一个在课堂上演示此错误的代码。 FastDateFormat是线程安全的。为什么?SimpleDateFormat和FastDateFormat有什么区别? 请用代码说明这个问题? 问题答案: 将中间结果存储在实例字段中。因此,如果两个线程

  • Azure Key Vault为什么或者如何安全?我需要在服务器上存储密钥URI、客户端Id和客户端机密,因此,如果任何人授予对承载应用程序的服务器的访问权限,他将能够访问存储在密钥库中的密钥和机密。这意味着将它们存储在服务器上是一样安全的,对吗?

  • 从Joshua Bloch的Effective Java中, > 数组与泛型类型有两个重要的区别。第一个数组是协变的。泛型是不变的。 协变简单地说,如果X是Y的子型,那么X[]也将是Y[]的子型。数组是协变的,因为字符串是对象的子类型,所以 不变简单地说,不管X是不是Y的子类型, 我的问题是为什么决定在Java中使数组是协变的?还有其他的SO帖子,比如为什么数组是不变的,但是列表是协变的?,但它们