为什么这个泛型数组创建不能按预期工作?

时间:2013-08-15 09:31:21

标签: java generics

我有以下代码,我正在创建一个数组并尝试在其中存储对象。在运行时,我得到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]不起作用?

3 个答案:

答案 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的原因。