作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们不能创建泛型数组,这是众所周知的事实,所以我不打算在这里提供对 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 设计者决定在运行时删除泛型类型:在运行时,类型参数由它们的上限替换。在您的情况下,在运行时,E
与 Object
相同。目前还不知道 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/
我是一名优秀的程序员,十分优秀!