Collection.toArray() java.lang.ClassCastException

2022-09-02 11:58:05
import java.util.HashMap;
import java.util.Map;


public class Main
{
    public static void main(String[] args)
    {
        Map<Integer,Class> map=new HashMap<Integer,Class>();
        map.put(0,Main.class);
        Class[] classes=(Class[])map.values().toArray();
        for (Class c:classes)
            System.out.println(c.getName());
    }

}

我尝试在这一行中施法,但得到例外。Class[] classes=(Class[])map.values().toArray();

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Class; at Main.main(Main.java:11)

问题是什么?


答案 1

改变:

Class[] classes = (Class[]) map.values().toArray();

自:

Class[] classes = map.values().toArray(new Class[0]);

这提供了有关要将数组转换为哪种类型的信息。否则,它将返回一个类型的数组(并且不能强制转换为 )。CollectionObjectClass[]


引自 Collect.toArray(T[] a) 的 API 文档

返回包含此集合中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。...
请注意,其功能与 相同。toArray(new Object[0])toArray()


答案 2

toArray()返回一个 [而不是从 ] 派生的任何对象。这个数组中的每个元素都是类型,但数组本身不是类型Object[]Object[]ClassClass[]

您应该将数组中的每个元素强制转换为,而不是尝试强制转换数组,或者使用Collection.toArray(T[])来避免强制转换。Class