Collection.toArray() java.lang.ClassCastException
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();
To:
Class[] classes = map.values().toArray(new Class[0]);
Это дает информацию о том, какой тип массива преобразует Collection
в. В противном случае он возвращает массив типа Object
(и который нельзя отнести к Class[]
).
Цитата из документация API для Collection.toArray(T[] a)
:
Возвращает массив, содержащий все элементы в этой коллекции; тип выполнения возвращаемого массива - тип указанного массива....
Обратите внимание, что toArray(new Object[0])
идентично функции toArray()
.
Ответ 2
toArray()
возвращает Object[]
[а не любой объект, полученный из Object[]
]. Каждый элемент этого массива имеет тип Class
, но сам массив не имеет типа Class[]
Вы должны использовать каждый элемент в массиве Class
вместо того, чтобы пытаться использовать массив, или использовать Collection.toArray(T []), чтобы избежать кастинга.
Ответ 3
Вместо этого используйте T [] toArray (T [] a) из Collection.
Ответ 4
Используйте этот код для перечисления values
из map
i.e: имена классов:
Object[] array = map.values().toArray();
for (Object object : array) {
System.out.println(object.toString());
}