Java:ArrayStoreException

Java:ArrayStoreException,java,arrays,generics,exception,Java,Arrays,Generics,Exception,我想通过E[]toArray(E[]a)用数组队列中的元素填充外部数组,但它在第一个System.arraycopy方法时会抛出ArrayStoreException。我想知道如何解决此问题,更重要的是,我想知道引发此异常的原因。 这是我的密码: public E[] toArray(E[] a) { if(a.length != size) a=(E[])Array.newInstance(a.getClass(), size); if(head<ta

我想通过
E[]toArray(E[]a)
用数组队列中的元素填充外部数组,但它在第一个
System.arraycopy
方法时会抛出
ArrayStoreException
。我想知道如何解决此问题,更重要的是,我想知道引发此异常的原因。

这是我的密码:

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;           
}

谢谢您的时间。

a.getClass()
不会返回
E
,它将返回一个E数组(因为a是一个数组)。这就是您在赋值时遇到问题的原因。

a.getClass()
不会返回
E
,它将返回一个E数组(因为a是数组)。这就是您在分配时遇到问题的原因

我怀疑异常实际上不会发生在您所指示的行上,但稍后会发生在
System.arraycopy

问题是,当您只想传入元素类型时,对
Array.newInstance
的调用会传入数组类型。换句话说,你说的是“给我一个元素类型为
String[]
”的新数组,而你真正想说的是“给我一个元素类型为
String
”的新数组”

为此,只需使用
getClass().getComponentType()
。如果您删除
getComponentType()
,这是一个更简单但完整的问题示例:

import java.lang.reflect.*;
公开课考试{
公共静态void main(字符串[]args){
字符串[]原始=新字符串[]{“x”};
字符串[]x=测试到阵列(原始);
}
公共静态E[]toArray(E[]a){
E[]copy=(E[])Array.newInstance(a.getClass().getComponentType(),a.length+1);
System.arraycopy(a,0,copy,0,a.length);
返回副本;
}
}

我怀疑异常实际上不会发生在您指示的行上,但稍后会发生在
System.arraycopy

问题是,当您只想传入元素类型时,对
Array.newInstance
的调用会传入数组类型。换句话说,你说的是“给我一个元素类型为
String[]
”的新数组,而你真正想说的是“给我一个元素类型为
String
”的新数组”

为此,只需使用
getClass().getComponentType()
。如果您删除
getComponentType()
,这是一个更简单但完整的问题示例:

import java.lang.reflect.*;
公开课考试{
公共静态void main(字符串[]args){
字符串[]原始=新字符串[]{“x”};
字符串[]x=测试到阵列(原始);
}
公共静态E[]toArray(E[]a){
E[]copy=(E[])Array.newInstance(a.getClass().getComponentType(),a.length+1);
System.arraycopy(a,0,copy,0,a.length);
返回副本;
}
}

您可以展示一个演示该问题的示例吗?(这是一个泛型类型吗?我想是的…)你让我们复制的越简单,它就越容易帮助你。(事实上,我怀疑我知道这个问题-只是现在检查一下…)对不起,但我不知道我应该提供什么额外的信息来解决这个问题。我的ArrayQueue是通用的,它有一个包含元素的字段
E[]elementData
elementData
的基本类型是
Object
,它在constructor中铸造为
(E[])
额外的信息将是一个简短但完整的示例-我们可以复制、粘贴、编译并运行它来查看问题。您能展示一个演示该问题的示例吗?(这是一个泛型类型吗?我想是的…)你让我们复制的越简单,它就越容易帮助你。(事实上,我怀疑我知道这个问题-只是现在检查一下…)对不起,但我不知道我应该提供什么额外的信息来解决这个问题。我的ArrayQueue是通用的,它有一个包含元素的字段
E[]elementData
elementData
的基本类型是
Object
,它在constructor中铸造为
(E[])
额外的信息将是一个简短但完整的示例-我们可以复制、粘贴、编译并运行它来查看问题。
String[] words = q.toArray(new String[2]);
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;
    }
}