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

时间:2019-05-10 09:01:41

标签: java arrays object casting

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

list.toArray(new int[list.size()][]);

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

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

//cast exception
return (int[][])list.toArray();
//this way is ok
return list.toArray(new int[list.size()][]);

为什么会引发该异常?

1 个答案:

答案 0 :(得分:8)

这里:

//cast exception
return (int[][])list.toArray();

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

要弄清楚,上面的调用不知道要使用的确切类型,因此必须诉诸于基本的默认Object[]。并且由于int[]的类型为Object,因此该list方法可以将这些数组存储到结果数组中。一个对象数组,每个对象都是一个int数组。

但是这里:

return list.toArray(new int[list.size()][]);

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

仅作记录:您可能更喜欢

return list.toArray(new int[0][]);

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