为什么java不允许创建通用数组?

时间:2015-05-27 03:07:02

标签: java arrays generics

现在,我之前已经看到许多与thisthis相似的问题,我理解答案是"因为删除"。但我不明白为什么擦除会阻止我们创建一系列泛型。

据我了解;数组表示连续的内存分配,包含对象的基元或引用。除非我错了,否则java数组只不过是C / C ++数组,而且它们周围都有一些奇特的装饰。这是对的吗?

如果是这样,为什么擦除会阻止为通用类型创建这样的数组?无论班级的类型如何,Aren都引用相同的大小?课程当然会更大或更小,但这不应该影响参考。那么我们不知道阵列应该有多大吗?

或者技术上是否可行,但如果我们允许创建通用数组,会遇到其他一些问题?

要明确:我理解擦除是什么以及它是如何工作的。 鉴于上述限制,我理解如何创建数组。我不想这样做。

我只是想了解创建数组时需要输入类型信息的原因。

2 个答案:

答案 0 :(得分:0)

你错了。 Java中的数组具有在其中编码的类型信息。数组本身是一个对象和一个类型。您可以创建String[]并在其上调用wait()和toString(),该类型与String类型不同。没有一种数组类型,每种类型都是不同的。您可以在getClass()上调用String[],它将返回与任何其他类型的数组不同的类。

因此,如果它自己的类型被删除(那就是“擦除”的含义)那么就没有类型可以制作T或其他类型。

所以你必须用Object[]伪造它,它会存储任何类型,但实际上并不是特定的类型。

但是,您可以反射性地创建数组类型。呼叫

Array.newInstance( t.getClass(), <dim> );

只要t是正确的类型,您就可以制作特定类型的数组。

答案 1 :(得分:0)

为什么不:

Object [] a = new Object[100];

a 没有做到这一点,你会期望一个假设的&#34;泛型&#34;数组要做什么?每个元素可以是不同类型的对象。您必须限定对元素的所有访问,但每个元素可以是任何内容,包括 null

在此示例中,符号 a 是指具有固定大小的对象,并且操作数组。唯一可以做到的事情&#34;&#34;数组是对其他对象的引用。