(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]时也会发生这种情况,当其中包含 String 时也会发生这种情况。 知道为什么吗?

88854 次浏览

这是因为当你使用

 toArray()

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

List

and not

List<String>

因为泛型只是一个源代码,在运行时不可用,所以它不能确定创建什么类型的数组。

使用

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

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

You are using the wrong toArray()

Remember that Java's generics are mostly syntactic sugar. An ArrayList doesn't actually know that all its elements are Strings.

要解决您的问题,请拨打 toArray(T[]),

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

注意,泛化的表单 toArray(T[])返回 T[],因此不需要显式强制转换结果。

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

像这样使用。

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

同样有效, 注意,一旦给方法提供了正确的 ArrayType,您甚至不需要再进行强制转换。

使用 JDK 11流 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);