Collection.toArray () java.lang.ClassCastException - PullRequest
19 голосов
/ 15 февраля 2012
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 ]

36 голосов
/ 15 февраля 2012

Изменение:

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

Кому:

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

Это дает информацию о том, в какой тип массива преобразовать Collection.В противном случае он возвращает массив типа Object (и его нельзя преобразовать в Class[]).


Цитируется из документации API для Collection.toArray(T[] a):

Возвращает массив, содержащий все элементы в этой коллекции;тип времени выполнения возвращаемого массива является типом указанного массива....
Обратите внимание, что toArray(new Object[0]) по функции идентичен toArray().

4 голосов
/ 15 февраля 2012

toArray() возвращает Object[] [а не любой объект, полученный из Object[]]. Каждый элемент в этом массиве имеет тип Class, но сам массив не имеет тип Class[]

Вы должны привести каждый элемент в массиве к Class вместо попытки приведения массива или использовать Collection.toArray (T []) , чтобы избежать приведения.

1 голос
/ 15 февраля 2012

Используйте взамен T [] toArray (T [] a) из Коллекция .

0 голосов
/ 15 февраля 2012

Используйте этот код для перечисления values из map, т.е. имен классов:

Object[] array = map.values().toArray();
for (Object object : array) {
    System.out.println(object.toString());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...