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() 

它返回一个 Object[],它不能转换为 String[](即使内容是字符串)这是因为 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 APItoArray ,您可以通过以下方式解决更普遍的问题:

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 回答