Подтвердить что ты не робот

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)

Что такое проблема?

4b9b3361

Ответ 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());
}