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

java.lang.ClassCastException on creating an Array of classes in java

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

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> 转换为 List

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

片段 2 和片段 3 都在创建 MyClass[],而不是 Class<MyClass>[]

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

请注意,泛型和数组不能很好地结合在一起 - 这就是为什么即使您的 "works fine" 代码也会收到警告。