我希望通过E[] toArray(E[] a)
使用我的ArrayQueue的元素填充外部数组,但不知怎的,它会在第一个ArrayStoreException
方法中抛出System.arraycopy
。我想知道如何解决这个问题,对我来说更重要的是要知道为什么抛出这个异常。
这是我的代码:
public E[] toArray(E[] a)
{
if(a.length != size)
a=(E[])Array.newInstance(a.getClass(), size);
if(head<tail)
System.arraycopy(elementData, head, a, 0, tail-head); // ArrayStoreException
else
{
System.arraycopy(elementData, head, a, 0, capacity-head);
System.arraycopy(elementData, 0, a, capacity-head, tail);
}
return a;
}
这是外部方法:
String[] words = q.toArray(new String[2]);
感谢您的时间。
答案 0 :(得分:2)
我怀疑异常并非实际在您指明的行上发生,但稍后会在System.arraycopy
中发生。
问题是,当您只想传入元素类型时,您对Array.newInstance
的调用会传入数组类型。换句话说,你说'#34;给我一个元素类型为String[]
&#34;的新数组。你真正想说的地方#34;给我一个元素类型为String
&#34;的新数组。
为此,请使用getClass().getComponentType()
。演示是一个更简单但完整的问题示例,如果您删除getComponentType()
:
import java.lang.reflect.*;
public class Test {
public static void main(String[] args) {
String[] original = new String[] { "x" };
String[] x = Test.<String>toArray(original);
}
public static <E> E[] toArray(E[] a) {
E[] copy = (E[]) Array.newInstance(a.getClass().getComponentType(), a.length + 1);
System.arraycopy(a, 0, copy, 0, a.length);
return copy;
}
}
答案 1 :(得分:1)
a.getClass()
不会返回E
,它会返回一个的数组(因为a是一个数组)。这就是你在分配时遇到问题的原因