2012-02-15 13 views
19
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()); 
    } 

} 

Próbuję rzucić w tej linii Class[] classes=(Class[])map.values().toArray();, ale otrzymuję wyjątek.Kolekcja.toArray() java.lang.ClassCastException

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Class; at Main.main(Main.java:11)

Jaki jest problem?

+0

Ponadto, co się dzieje z "[L ..."; notacja dla nazw klas? – masterxilo

Odpowiedz

34

Zmiana:

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

Do:

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

Daje informacje o jaki rodzaj tablicy do konwertowania Collection do. W przeciwnym razie zwraca tablicę typu Object (która nie może być rzutowana na Class[]).


Cyt z the API documentation for Collection.toArray(T[] a):

Zwraca tablicę zawierającą wszystkie elementy tego zbioru; typem działania zwróconej tablicy jest tablica określonej tablicy. ...
Należy pamiętać, że toArray(new Object[0]) jest identyczna pod względem funkcji do toArray().

4

toArray() zwraca wartość Object[] [a nie dowolny obiekt pochodzący z Object[]]. Każdy element tej tablicy jest typu Class, ale sama tablica nie jest typu Class[]

oddasz każdego elementu w tablicy do Class zamiast próbować rzucać tablicę lub użyj Collection.toArray(T[]) uniknąć odlewania.

0

użyć tego kodu na wystawianie na zewnątrz values z map nazwy klas tj:

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