java: (String[])List.toArray() gives ClassCastException 将java中的代码 "(String[])List.toArray() gives ClassCastException" 翻译成中文时,请不要翻译html标签和引号或双引号内的内容。

7 浏览
0 Comments

java: (String[])List.toArray() gives ClassCastException 将java中的代码 "(String[])List.toArray() gives ClassCastException" 翻译成中文时,请不要翻译html标签和引号或双引号内的内容。

在Android平台上,以下代码总是在第三行抛出ClassCastException:

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

当v2是Object[0]或者其中包含字符串时,也会出现这个问题。

有什么想法为什么会出现这个问题吗?

0
0 Comments

在Java中,当使用toArray()方法时,它会返回一个Object[]数组,而无法强制转换为String[]数组(即使其中的内容都是字符串)。这是因为toArray方法只接收一个List对象,而不是List对象,因为泛型只存在于源代码中,而在运行时不可用,因此无法确定要创建哪种类型的数组。

解决方法是使用toArray(new String[v2.size()]),它会分配正确类型(String[])和正确大小的数组。

然而,这并不是最初的原因。在集合类引入泛型之前,toArray方法就已经存在了。

这是正确的解决方法,但不是正确的解释。你不能将Object[]数组强制转换为Double[]数组,这只是一种语言特性,而不是与泛型有关。你可以将Object对象强制转换为Double对象,只要确保它实际上是Double类型的即可。因此在逻辑上,你也可以对数组进行相同的操作,但这并不是语言的一部分。如果将Object转换为Double,将会进行运行时检查以确保Object确实是Double。而将Double转换为Object时,不需要运行时检查,因为Object是Double的父类。

在IntelliJ中进行此操作时,会收到一个警告,建议使用toArray(new String[0]),原因是:在旧版本的Java中,使用预分配大小的数组是推荐的做法,因为创建正确大小的数组需要使用反射调用,而这个过程通常较慢。然而,自从OpenJDK 6的最新更新以来,这个调用已经被内部化,使得使用空数组的性能与预分配大小的数组相同,甚至有时更好。对于并发集合来说,传递预分配大小的数组是危险的,因为在size和toArray调用之间可能会发生竞争。

0
0 Comments

使用Java 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);

然而,有时在使用toArray方法时可能会遇到ClassCastException的问题。这个问题的原因是在将包含String对象的Object数组转换为String数组时,类型转换出现错误。

解决这个问题的方法是在toArray方法中指定数组的类型。这可以通过使用toArray(String[]::new)来实现,其中String[]::new指定了要创建的目标数组的类型。

使用这种方法,可以将Object数组转换为String数组,避免了ClassCastException的问题。

0
0 Comments

在这个问题中,出现了一个ClassCastException,即类型转换异常。问题的原因是使用了错误的toArray()方法。

在Java中,泛型大部分是语法糖。ArrayList并不知道它的所有元素都是字符串。因此,如果直接使用List.toArray()方法,返回的是一个Object数组,而不是String数组。

要解决这个问题,应该调用toArray(T[])方法。在这个例子中,应该使用以下代码:

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

值得注意的是,泛型化的toArray(T[])方法返回的是T[]类型,因此不需要显式地进行类型转换。

这样,就可以避免ClassCastException的异常,并得到一个正确的String数组。

0