现在,我之前已经看到许多与this或this相似的问题,我理解答案是"因为删除"。但我不明白为什么擦除会阻止我们创建一系列泛型。
据我了解;数组表示连续的内存分配,包含对象的基元或引用。除非我错了,否则java数组只不过是C / C ++数组,而且它们周围都有一些奇特的装饰。这是对的吗?
如果是这样,为什么擦除会阻止为通用类型创建这样的数组?无论班级的类型如何,Aren都引用相同的大小?课程当然会更大或更小,但这不应该影响参考。那么我们不知道阵列应该有多大吗?
或者技术上是否可行,但如果我们允许创建通用数组,会遇到其他一些问题?
要明确:我理解擦除是什么以及它是如何工作的。 鉴于上述限制,我理解如何创建数组。我不想这样做。
我只是想了解创建数组时需要输入类型信息的原因。
答案 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;数组是对其他对象的引用。