2011-11-27 8 views
3

は、なぜ私は、次のコードのためのなぜ次のJavaコードの例外はありますか?

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

例外を取得していますか?

import java.util.Set; 
import java.util.HashMap; 


public class Main 
{ 
     public static void main(String args[]) 
     { 
       HashMap<Integer, Double> h = new HashMap<Integer,Double>(); 
       h.put(1, 2.2); 

       Integer[] keys = (Integer[])h.keySet().toArray(); 
     } 
} 

[]キーセットは整数が含まれているので、[] INTEGERに返されたオブジェクトをキャストすることはできないでしょうか?キー配列を整数配列にコピーする高速な代替手段は何ですか?

+0

配列型は、直接そのようにキャストすることはできません。 – Polynomial

答えて

4

使用

Integer[] keys = h.keySet().toArray(new Integer[h.keySet().size()]); 

キーセットが実際にJavaが使用するための最良の方法ですと同じサイズの配列を渡します指定された配列は、キーセットのすべての値を格納します。指定された配列は、キーセットと同じサイズでない場合、Javaはキーセットのサイズに合わせてまったく新しい配列を作成する必要があります。渡された最初の配列は決して使用されません。ガベージコレクタがそれを再び割り当てるまでメモリを占有します。

1

いいえ、あなたは直接そのようにキャストすることはできません。

あなたがInteger[]をしたい場合は、h.keySet().toArray(new Integer[0])を試してみてください。

Set#toArray(T[])

また、あなたはtoArray()によって返される配列を反復処理し、正しいサイズの独自のInteger[]を作成することができますし、手動で各要素をキャスト。

+0

@downvoterなぜですか? – Jeffrey

2

のtoArrayメソッドに正しい型の配列を提供します

Integer[] keys = h.keySet().toArray(new Integer[0]); 
関連する問題