Collection.toArray()java.lang.ClassCastException

时间:2012-02-15 12:33:59

标签: java collections

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)

什么是问题?

4 个答案:

答案 0 :(得分:36)

变化:

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

要:

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

这提供了有关将Collection转换为的数组类型的信息。否则,它返回一个类型为Object的数组(并且不能转换为Class[])。


引自the API documentation for Collection.toArray(T[] a)

  

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

使用来自Collection的T [] toArray(T [] a)代替。

答案 3 :(得分:0)

使用此代码列出values map,即类名:

Object[] array = map.values().toArray();
for (Object object : array) {
    System.out.println(object.toString());
}