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()][]);
为什么会引发该异常?
答案 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年,您更喜欢传递一个空数组。