web-dev-qa-db-ja.com

java:(String [])List.toArray()はClassCastExceptionを返します

次のコード(Androidで実行)では、3行目に常にClassCastExceptionが表示されます。

final String[] v1 = i18nCategory.translation.get(id);
final ArrayList<String> v2 = new ArrayList<String>(Arrays.asList(v1));
String[] v3 = (String[])v2.toArray();

また、v2がObject [0]の場合、およびその中に文字列がある場合にも発生します。理由は何ですか?

92
Gavriel

これは、使用するときに

 toArray() 

これは、Object []を返します。Object[]はString []にキャストできません(内容がストリングであっても)。これは、toArrayメソッドが取得するのは

List 

ではなく

List<String>

ジェネリックはソースコードのみのものであり、実行時には利用できないため、作成する配列のタイプを決定することはできません。

つかいます

toArray(new String[v2.size()]);

適切な種類の配列(String []および適切なサイズ)を割り当てます

231
MeBigFatGuy

間違ったtoArray()を使用しています

Javaのジェネリックはほとんど構文糖衣であることを忘れないでください。 ArrayListは、そのすべての要素が文字列であることを実際には知りません。

問題を修正するには、 toArray(T[]) を呼び出します。あなたの場合、

_String[] v3 = v2.toArray(new String[v2.size()]);
_

汎用形式toArray(T[])は_T[]_を返すため、結果を明示的にキャストする必要はありません。

35
Dilum Ranatunga
String[] str = new String[list.size()];
str = (String[]) list.toArray(str);

このように使用します。

0
MakNe