java: (String[])List.toArray() gives ClassCastException
JavaListClasscastexceptionToarrayJava Problem Overview
The following code (run in android) always gives me a ClassCastException in the 3rd line:
final String[] v1 = i18nCategory.translation.get(id);
final ArrayList<String> v2 = new ArrayList<String>(Arrays.asList(v1));
String[] v3 = (String[])v2.toArray();
It happens also when v2 is Object[0] and also when there are Strings in it. Any Idea why?
Java Solutions
Solution 1 - Java
This is because when you use
toArray()
it returns an Object[], which can't be cast to a String[] (even tho the contents are Strings) This is because the toArray method only gets a
List
and not
List<String>
as generics are a source code only thing, and not available at runtime and so it can't determine what type of array to create.
use
toArray(new String[v2.size()]);
which allocates the right kind of array (String[] and of the right size)
Solution 2 - Java
You are using the wrong toArray()
Remember that Java's generics are mostly syntactic sugar. An ArrayList
To fix your problem, call toArray(T[])
. In your case,
String[] v3 = v2.toArray(new String[v2.size()]);
Note that the genericized form toArray(T[])
returns T[]
, so the result does not need to be explicitly cast.
Solution 3 - Java
String[] v3 = v2.toArray(new String[0]);
also does the trick, note that you don't even need to cast anymore once the right ArrayType is given to the method.
Solution 4 - Java
Using toArray
from the JDK 11 Stream API, you can solve the more general problem this way:
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);
Solution 5 - Java
String[] str = new String[list.size()];
str = (String[]) list.toArray(str);
Use like this.