转换为通用类型导致 Java 中的 ArrayStoreException

Cast to generic type causing ArrayStoreException in Java

我正在创建一个 class,其中包含一个名为 arrayObject[] 类型的实例变量。此 class 包括 returns 一个 T[] 的方法,其中 T 是泛型。该方法应将 array 的内容复制到要返回的数组中。相关代码如下所示:

@SuppressWarnings("unchecked")
T[] arr = (T[])Array.newInstance(a.getClass(), array.length);
for (int i = 0; i < array.length; i++) {
    @SuppressWarnings("unchecked")
    T temp = (T)array[i];
    arr[i] = temp;
}
return arr;

在上面的代码片段中,a 是作为参数传递的另一个数组。

问题是,当我调用该方法时,它会抛出 ArrayStoreException。我不确定为什么要这样做,因为我将初始值转换为类型 T,然后再将其存储在类型为 T[] 的数组中,因此类型匹配。为什么还是抛异常?

使用该代码,您可以创建一个 T[][],因为 a.getClass()Class<T[]>

你要的是a.getClass().getComponentType(),才是真正的Class<T>

所以:

@SuppressWarnings("unchecked")
T[] arr = (T[])Array.newInstance(a.getClass().getComponentType(), array.length);
for (int i = 0; i < array.length; i++) {
    @SuppressWarnings("unchecked")
    T temp = (T)array[i];
    arr[i] = temp;
}
return arr;

或者你可以使用jre方法

Arrays.copyOf(array, array.length); // creates a new array and copies the content

你需要检查array[i]T的类型之间的关系,因为它们不一定有扩展关系。