1

誰かが次のコードの何が問題になっているのか教えてもらえますか?

    Set<String> cmds = *a method call that returns a Set<String>*
    String[] cmdarr = (String[]) cmds.toArray();
    int i;
    for(i=0; i<cmdarr.length;i++){
        System.out.println(cmdarr[i]);

次のエラーが発生しました。

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
at a.jim.Test.main(Test.java:79)

前もって感謝します!

4

3 に答える 3

5

それSet自体には、実行時に利用可能な要素に関するタイプ情報はありません。タイプパラメータ<String>はコンパイル中に消去されます。したがって、このtoArray()メソッドは常に型の配列を作成しますObject[]

配列をメソッドに渡し、セットの内容をメソッドにコピーすることができます。

String[] cmdarr = cmd.toArray(new String[cmd.size()]);

渡す配列が小さすぎるため、同じコンポーネントタイプの新しい配列がリフレクションを使用して作成されますが、正しいサイズの1つを渡すほど効率的ではありません。

于 2012-05-21T01:43:50.540 に答える
1

タイプ参照を渡してみてください。

String[] cmdarr = cmds.toArray(new String[0]);
于 2012-05-21T01:43:22.743 に答える
0

@ericksonが言ったことに便乗して、のパラメータ化された型Setは単にコンパイル時の安全性チェックです。コードがコンパイルされると、Set<String>実際にはになりSetますObjects

キャスティングは、実行時に高い特異性を実現する方法です。前の段落で説明したように、ジェネリック型がコンパイルされるときに発生する「型消去」と呼ばれるものが原因で、コンパイル時エラーが発生します。参照cmdarrは、実際にはタイプのオブジェクトの単なるプレースホルダーですString[]。このプレースホルダーは、プレースホルダーがを指すことができないのObject[]と同じように、決して指すことはできません。Set<List>Set<ArrayList>

Javaチュートリアルのジェネリックスに関するウォークスルーをご覧ください。頭を悩ませるのは大変ですが、Collectionsパッケージを使用する場合は非常に貴重です。

Javaチュートリアル:レッスンジェネリック

于 2012-05-21T02:26:09.667 に答える