Java 为什么这个泛型数组创建没有按预期工作?
我在下面的代码中创建了一个数组并试图在其中存储对象。在运行时,我得到一个Java 为什么这个泛型数组创建没有按预期工作?,java,generics,Java,Generics,我在下面的代码中创建了一个数组并试图在其中存储对象。在运行时,我得到一个ArrayStoreException import java.lang.reflect.Array; public class GenericsArrayCreation<T> { public static <T> void Test(T[] A){ @SuppressWarnings("unchecked") T[] temp = (T[]) Arra
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);
}
}
为什么这是错误的
A.getClass()在运行时返回一个String
,因此temp
应该是一个字符串数组。在这种情况下,为什么赋值temp[i]=A[i]
不起作用?试着打印temp.getClass()
-它是一个数组数组,T[][
。您将需要Class.getComponentType
A
的类型是java.lang.String[]
,而不是java.lang.String
您需要的是数组的组件类型,而不是数组类型本身
请改为使用此行:
T[] temp = (T[]) Array.newInstance(A.getClass().getComponentType(), A.length);
代码运行正常。您的A.getClass()
返回一个String
数组,而不是String
,这就是为什么您得到ArrayStoreException
您是否确认(使用调试器或print
语句)了A.getClass()
是String
?否。文档说明:如果componentType表示数组类,则新数组的维度数等于维度数之和。长度和componentType的维度数。在本例中,新数组的组件类型是componentType的组件类型。@什么?“返回表示数组组件类型的类。如果该类不表示数组类,则该方法返回null。”老实说,我认为该API很糟糕。谢谢!这就解决了!
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);
}
}