List class's toArray in Java- Why can't I

2019-02-16 19:36发布

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?

3条回答
Summer. ? 凉城
2楼-- · 2019-02-16 19:54

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楼-- · 2019-02-16 19:57

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()]);
查看更多
别忘想泡老子
4楼-- · 2019-02-16 20:06

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.

查看更多
登录 后发表回答