关于在java中创建类数组的java.lang.ClassCastException

时间:2015-03-12 10:24:18

标签: java arrays generics

我想创建一个类数组,我有这些:

1)工作正常

Class<MyClass>[] array = (Class<MyClass>[]) new Class<?>[list.size()];

2)java.lang.ClassCastException

Class<MyClass>[] array = (Class<MyClass>[]) Array.newInstance(MyClass.class, list.size());

3)我们有一个通用方法,工作正常

public static <T> List<T> method(T arg , T[] array){
    array = (T[]) Array.newInstance(arg.getClass(), 1);
    ArrayList<T> list = new ArrayList<T>(Arrays.asList(array));
    array[0] = arg;
    return new ArrayList<T>(Arrays.asList(array));
}

请解释为什么我们在2中获得例外?据我所知,我们在3中做了同样的事情,那么区别是什么?

更新

我想我的困惑是因为我们有:

类型不匹配:无法从List&lt;转换等级&lt; MyClass&gt; &GT;列出&lt; MyClass&gt;

List<MyClass> list = Utils.addToList(MyClass.class, null);

作品

List<Class<MyClass>> list = Utils.method(MyClass.class, null);

我想我错过了什么,但我不确定是什么......

所以它终于明白了我的想法:

List<Class<MyClass>> list = Utils.method(MyClass.class, null);

Class<MyClass>[] array2 = (Class<MyClass>[]) Array.newInstance(MyClass.class.getClass(), list.size());

List<Class<MyClass>> list2 = Utils.method(MyClass.class, list.toArray(array2));

1 个答案:

答案 0 :(得分:4)

代码段2和3都创建了MyClass[],而不是Class<MyClass>[]

元素类型由Array.newInstance的第一个参数决定。如果您想要一个每个元素都是Class引用的数组,则需要传入Class.class

请注意,泛型和数组不能很好地在一起播放 - 这就是为什么即使你的工作正常也能得到警告的原因#34;代码。