Search code examples
javaarrayscastingprimitive

Why can you cast int[] to Object, but not to Object[]?


So this works:

int i;
Object a  = (Object) i;
int[] t;
Object b = (Object) t;
String[] s;
Object[] t = (Object[]) s;

But this does not:

int[] t;
Object[] z = (Object[]) t;

All in all I get the first part (boxing), but I find it highly unintuitive that the second part does not work. Is there a specific reason why (beside String inheriting from Object and int not inheriting from Object)?

Edit:

To refine my question, this also works:

int a = 2;
int b = 3;
int c = 4;
int d = 2;
Object[] o = new Object[] {a,b,c,d};

But then the following does not:

int[] t = (int[]) o;

Surprisingly you get the same problem with String:

String sa = "a";
String sb = "b";
String sc = "c";
String sd = "d";
Object[] so = new Object[] {sa,sb,sc,sd};
String[] st = (String[]) so;

Yields a class cast exception on the last line. Still this works:

Object[] sy = (Object[])new String[]{sa,sb,sc,sd};
String[] sz = (String[]) sy;

Solution

  • I just found the answer I was looking for myself. The reason why you cannot cast int[] to Object[] is not because int is a primitive and does not extend Object, but because int[] itself does not extend Object[]. In code:

    int[] t = new int[0];
    Object ot = t;
    System.out.println(ot instanceof Object[]);
    // --> prints 'false'
    String[] s = new String[0];
    Object os = s;
    System.out.println(os instanceof Object[]);
    // --> prints 'true'
    

    Edit: the boxing is necessary because Eclipse knows that int[] and Object[] are incompatible.

    Edit II: Btw this if(obj instanceof Object[]) allows to check wether a boxed array is an array of a primitive type.