gpt4 book ai didi

java - 为什么泛型数组的声明是正确的?

转载 作者:行者123 更新时间:2023-11-30 08:11:12 25 4
gpt4 key购买 nike

我们不能创建泛型数组,这是众所周知的事实,所以我不打算在这里提供对 JLS 的正式引用。但是我们可以声明这样的数组,如下所示:

static <E> void reduce() {
List<Integer>[] arr; //compiles fine
E[] avv; //compiles fine
avv = new E[10]; //doesn't compile
arr = new List<Integer>[10]; //doesn't compile
}

有人知道这样声明的原因吗?

最佳答案

首先,我假设你的意思是

avv = new E[2];             //doesn't compile
arr = new List<Integer>[2]; //doesn't compile

在你的方法的最后两行。创建新数组时必须指定数组的大小。不过,代码仍然无法编译。

数组早于泛型。数组从 Java 的第一个版本开始就存在,而泛型只是在 1.5 版本中才添加的。为了不破坏旧代码,Java 设计者决定在运行时删除泛型类型:在运行时,类型参数由它们的上限替换。在您的情况下,在运行时,EObject 相同。目前还不知道 E 到底是哪种类型。

这是个问题,因为数组元素类型在运行时不会被删除。 Integer[]String[] 是不同的类型,即使在运行时也是如此。如果您编写 new E[2],Java 运行时不知道它必须创建哪种数组。它可以是 String[]Integer[],或任何其他数组类型。因此,您不能使用通用元素创建新数组。

仍然允许具有通用元素的数组作为类型,主要是为了在方法参数中使用它们:

<E> E doSomething(E[] param) { ... }

实际的数组是在程序的另一部分创建的,它的类型是已知的。你可以调用这个方法

String result = doSomething(new String[2]);

例如。

关于java - 为什么泛型数组的声明是正确的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31156277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com