java: (String[])List.toArray() 给出 ClassCastException

2022-08-31 09:19:19

下面的代码(在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] 时,以及当其中有字符串时,也会发生这种情况。任何想法为什么?


答案 1

这是因为当您使用时

 toArray() 

它返回一个 Object[],它不能被强制转换为 String[](即使内容是 Strings)这是因为 toArray 方法只得到一个

List 

而不是

List<String>

因为泛型只是源代码,在运行时不可用,因此它无法确定要创建哪种类型的数组。

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

它分配了正确类型的数组(String[]和正确的大小)


答案 2

您使用了错误toArray()

请记住,Java的泛型主要是语法糖。ArrayList 实际上并不知道它的所有元素都是 Strings。

要修复您的问题,请调用Array(T[])。在您的情况下,

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

请注意,泛化形式返回 ,因此不需要显式转换结果。toArray(T[])T[]