为什么Object [] objs(objs [i]的类型为int [])不能转换为int [] []

wqb*_*ill 7 java arrays casting object

list.toArray()返回Object [],并且仅包含int []。所以我认为我可以将其直接转换为int [] []。但是实际上我错了,它将导致强制转换异常。

list.toArray(new int[list.size()][]);
Run Code Online (Sandbox Code Playgroud)

这样就可以了,但是我还是很困惑。

List<int[]> list = new ArrayList<>();
//some code

//cast exception
return (int[][])list.toArray();
//this way is ok
return list.toArray(new int[list.size()][]);
Run Code Online (Sandbox Code Playgroud)

为什么会引发该异常?

Gho*_*ica 8

这里:

//cast exception
return (int[][])list.toArray();
Run Code Online (Sandbox Code Playgroud)

由于类型擦除,此代码创建了一个实际的Object数组。对象数组不是整数数组,因此无法强制转换。一个装鸡蛋的盒子不会变成牛奶瓶,只是因为你尖叫着“看着,变成一个瓶子”。

要明确地说:上述调用不知道要使用的确切类型,因此必须使用该基本default Object[]。并且由于int[]是Object类型的,因此该列表方法可以将这些数组存储到结果数组中。一个对象数组,每个对象都是一个int数组。

但在这里:

return list.toArray(new int[list.size()][]);
Run Code Online (Sandbox Code Playgroud)

您明确地说返回的数组应该是type int[][]。因此,在运行时,该方法的主体知道它应该返回该类型。

仅作记录:您可能更喜欢

return list.toArray(new int[0][]);
Run Code Online (Sandbox Code Playgroud)

提供“已调整大小”的数组是早期的遗留物,通常在2019年,您更喜欢传递一个空数组。

  • 除了提供一个清晰明确的答案外,*一个鸡蛋盒并不会因为您尖叫而变成牛奶瓶* +1 (3认同)
  • @DodgyCodeException同样,“ Object []”和“ int []”类型根本不相关。请参阅我对答案所做的更新。`int []`具有Object类型,因此Object数组可以容纳`int []`条目。它还可以容纳一个`int []`,然后是一个String,然后是Integer,然后是null,然后是一个MilkBottles数组。因为Java中的任何内容,最终都是对象。但是数组类型是固定的,如前所述:三种类型:Object数组和int数组是“不相关”或相等或“父”和“子”。 (2认同)
  • @DodgyCodeException也许[this](https://ideone.com/fzmghs)有助于理解吗? (2认同)