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)
什么是问题?
答案 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());
}