【问题标题】:java.lang.ClassCastException on creating an Array of classes in javajava.lang.ClassCastException 在 java 中创建类数组
【发布时间】:2015-03-12 10:24:17
【问题描述】:

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

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

【问题讨论】:

    标签: java arrays generics


    【解决方案1】:

    sn-ps 2 和 3 都在创建 MyClass[],而不是 Class&lt;MyClass&gt;[]

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

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

    【讨论】:

    • ... 我猜 OP 更可能想要MyClass[]
    • @Duncan:说实话,目前还不清楚 OP 真正想要做什么。我只是在解释他们当前的代码,希望这足以帮助...
    • 我想,我明白你的意思,但我还是很困惑。我更新了我的问题,你能看看吗?
    • @KatrinnaL: 那是因为你传递了一个Class&lt;MyClass&gt; 引用作为arg 的值,所以T 被推断为Class&lt;MyClass&gt;,你最终得到一个@ 987654331@。目前还不清楚您真正想要实现的目标。
    • 谢谢,这对我理解我想做的事情有很大帮助:)
    猜你喜欢
    • 2015-02-28
    • 1970-01-01
    • 2015-03-31
    • 2014-06-03
    • 2011-07-22
    • 2023-03-11
    • 2021-04-10
    • 1970-01-01
    • 2014-06-04
    相关资源
    最近更新 更多