2
public class Test {

    public static void main(String[] args) {
        System.out.println(new CountingGenerator.String(12).next());
        List<Integer> list=new ArrayList<Integer>();
        list.add(new Integer(1));
        list.add(new Integer(2));

        Integer[] c = {1,3,3};
        //throw an exception:
        c = (Integer[]) list.toArray();
    }
}

I wonder why this happened ? Integer is a subclass of Object,so it should be Ok instead! please answer me deeply! I want know why? what's the principle ?

roeygol
  • 4,908
  • 9
  • 51
  • 88
topCoder
  • 95
  • 8
  • List list=new ArrayList();why "list.toArray() " is an Object array???? – topCoder Mar 28 '15 at 08:58
  • you might want to take a look at this link http://stackoverflow.com/questions/1115230/casting-object-array-to-integer-array-error – Toni Mar 28 '15 at 09:03
  • There is no automatic recursive cast to cast Arrays of type A to type B. You have to do that manually or by using dedicated methods like 'Arrays.Copyof()'. – Tom Mar 28 '15 at 09:08
  • ”you can't treat a list of Integer IS-A list of Object “ thanks tom!thanks toni! – topCoder Mar 28 '15 at 09:23

1 Answers1

4

Change the line

 c=(Integer[]) list.toArray();

to

c= list.toArray(c); // add c as parameter

In your list.toArray(); returns Object[] and JVM doesn't know how to blindly downcast Object[] to Integer[].

public Object[] toArray()      //return Object type array
public <T> T[] toArray(T[] a) //Returns an array containing all of the elements in this collection; the runtime type of the returned array is that of the specified array

Java Docs

singhakash
  • 7,891
  • 6
  • 31
  • 65