0

次のコードで ClassCastException を取得しています。

Destination[] destinations;
ArrayList<Destination> destinationsList = new ArrayList<Destination>(); 

// .....

destinations = (Destination[]) destinationsList.toArray();

私の宛先クラスは次のようになります。

public class Destination {

    private String code;

    Destination (String code) {

        this.code = code;

    }

   public String getCode () {

        return code;

   }
}

構文的にはエラーは発生しません。これは実行時にのみ発生します。すべてのクラスが本質的に Object クラスの派生物ではないため、混乱していますか? もしそうなら、なぜこのキャスト変換エラーが発生するのでしょうか?

4

3 に答える 3

6

toArray()を返しますObject[]。必要なのはtoArray(T[] a)、型の消去のためです。ジェネリック コレクションは型付き配列を作成できません。

オーバーロードされたメソッドを使用すると、オブジェクトの型付き配列を作成するのに役立ちDestinationます。

使用する

destinations = destinationsList.toArray(new Destination[destinationList.size()]);

于 2013-11-14T08:30:55.083 に答える
2

toArray はあなたのオブジェクト配列ではなくオブジェクト配列を返すためDestination[]

これに置き換えます

destinations[] = destinationsList.toArray(new Destination[destinationList.size()]);

これにより、新しい Destination Array オブジェクトが設定され、設定された配列が返されます。

編集:

@ZouZouの回答のコメントで質問に答えるには。

a は aによって参照できるnew Destination[]ため、が必要ですが、その逆は不可能です。Destination[]Object[]

物事を明確にするために、

String s = "hello";
Object o = s;
s = (String) o; //works

//but

String s = "hello";
Object o = s;
o = new Object;
s = (String) o; //gives you a ClassCastException because an Object
                //cannot be referred by a string

String にはObject継承によってクラスで定義されたすべてのプロパティがありますが、オブジェクトにはオブジェクトのプロパティがありませんString。そのため、継承ツリーをキャストすることは合法であり、ダウンキャストは合法ではありません。

于 2013-11-14T08:33:16.270 に答える