2012-02-15 6 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()); 
    } 

} 

私はこの行にキャストしようとしましたClass[] classes=(Class[])map.values().toArray();しかし、例外を取得します。Collection.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)

問題は何ですか?

+0

、とまで何「[L ...。」クラス名の表記法? – masterxilo

答えて

34

変更:

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()と同じです。

4

toArray()は、Object[] [Object[]から派生したオブジェクトはありません]を返します。この配列の各要素はタイプClassのですが、配列自体は、あなたが代わりに配列をキャストしようとしているのClassに、配列の各要素をキャストし、キャストを避けるためにCollection.toArray(T[])を使用する必要があるタイプでClass[]

ではありません。

1

代わりにCollectionのT [] toArray(T [] a)を使用してください。

0

利用valuesmapのすなわち、クラス名をリストするために、このコード:また

Object[] array = map.values().toArray(); 
for (Object object : array) { 
    System.out.println(object.toString()); 
} 
関連する問題