我有以下代码,我正在创建一个数组并尝试在其中存储对象。在运行时,我得到ArrayStoreException
。
import java.lang.reflect.Array;
public class GenericsArrayCreation<T> {
public static <T> void Test(T[] A){
@SuppressWarnings("unchecked")
T[] temp = (T[]) Array.newInstance(A.getClass(), A.length);
for(int i = 0;i<temp.length;i++){
temp[i] = A[i];
System.out.println(temp[i].toString());
}
}
public static void main(String[] args){
String[] strs = {"a", "b", "c"};
GenericsArrayCreation.Test(strs);
}
}
我知道这是因为声明
T[] temp = (T[]) Array.newInstance(A.getClass(), A.length);
为什么这是错的? A.getClass()
在运行时返回String
,因此temp
应该是一个字符串数组。在这种情况下,为什么作业temp[i] = A[i]
不起作用?
答案 0 :(得分:6)
A
的类型为java.lang.String[]
,而不是java.lang.String
。
您需要数组的组件类型,而不是数组类型本身。
请改用此行:
T[] temp = (T[]) Array.newInstance(A.getClass().getComponentType(), A.length);
并且代码运行正常。
答案 1 :(得分:0)
尝试打印temp.getClass()
- 它是一个数组数组T[][]
。您需要Class.getComponentType
。
答案 2 :(得分:0)
您的A.getClass()
会返回String
数组而不是String
,这就是您获得ArrayStoreException
的原因。