转换为通用类型导致 Java 中的 ArrayStoreException
Cast to generic type causing ArrayStoreException in Java
我正在创建一个 class,其中包含一个名为 array
的 Object[]
类型的实例变量。此 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
的类型之间的关系,因为它们不一定有扩展关系。
我正在创建一个 class,其中包含一个名为 array
的 Object[]
类型的实例变量。此 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
的类型之间的关系,因为它们不一定有扩展关系。