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