112

次のコード(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]の場合、および文字列が含まれている場合にも発生します。なぜアイデアはありますか?

4

5 に答える 5

258

これは、使用する場合

 toArray() 

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

List 

ではなく

List<String>

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

使用する

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

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

于 2011-04-16T23:26:05.490 に答える
36

間違った使い方をしているtoArray()

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

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

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

ジェネリック化されたフォームはをtoArray(T[])返すT[]ため、結果を明示的にキャストする必要はないことに注意してください。

于 2011-04-16T23:59:29.237 に答える
1
String[] v3 = v2.toArray(new String[0]); 

また、トリックも行います。メソッドに適切なArrayTypeが指定されたら、キャストする必要がなくなることに注意してください。

于 2019-11-28T21:55:02.677 に答える
0
String[] str = new String[list.size()];
str = (String[]) list.toArray(str);

このように使用します。

于 2019-02-09T09:41:52.163 に答える
0

JDK 11 Stream APIを使用toArrayすると、より一般的な問題を次のように解決できます。

Object[] v1 = new String[] {"a", "b", "c"}; // or array of another type
String[] v2 = Arrays.stream(v1)
    .<String>map((Object v) -> v.toString()).toArray(String[]::new);
于 2021-08-07T11:29:20.110 に答える