问题
I defined List<Integer> stack = new ArrayList<Integer>();
When I'm trying to convert it to an array in the following way:
Integer[] array= stack.toArray();
I get this exception:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from Object[] to Integer[].
Why? It is exactly the same type- Integer to Integer. It's not like in this generic case when the classes are father-and-son relation
I tried to do casting:
Integer[] array= (Integer[]) stack.toArray();
But here I get this error:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
What is the problem?
回答1:
Because of type erasure, the ArrayList does not know its generic type at runtime, so it can only give you the most general Object[]. You need to use the other toArray method which allows you to specify the type of the array that you want.
Integer[] array= stack.toArray(new Integer[stack.size()]);
回答2:
The way to do it is this:
Integer[] array = stack.toArray(new Integer[stack.size()]);
For the record, the reason that your code doesn't compile is not just type erasure. The problem is that List<T>.toArray()
returns an Object[]
and it has done this before generics were introduced.
回答3:
Do this instead:
Integer[] array = stack.toArray(new Integer[stack.size()]);
We need to pass the "seed" array as an argument to the toArray
method.
来源:https://stackoverflow.com/questions/7281793/list-classs-toarray-in-java-why-cant-i-convert-a-list-of-integer-to-an-int