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

7

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()][]);

为什么会抛出那个异常?

因为 Object[] 不是 int[][],在这种情况下甚至更普遍的情况下都不是。请检查两个 toArray 实现的源代码。 - luk2302
你也不能使用一个字符串列表来实现它。 - Louis Wasserman
1个回答

8

在这里:

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

由于类型擦除,这个例子创建了一个实际的 Object 数组。一个 Object 数组不是一个 int 数组的数组,因此你不能将它强制转换。一个用来装鸡蛋的盒子并不能因为你大喊“变成一个瓶子”而变成牛奶瓶。
为了更清晰地解释:上述调用不知道要使用什么精确类型,所以它只能使用基本默认值Object[]。因为 int[] 是 Object 类型,所以该列表方法可以将这些数组存储到结果数组中。一个对象数组,每个对象都是一个 int 数组。
但是在这里:
return list.toArray(new int[list.size()][]);

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

仅供参考:您可能更喜欢

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

提供一个“已经大小合适”的数组是早期的遗留问题,在一般情况下,2019年时,更倾向于传递一个空数组。


3
除了回答很好并且清晰之外,“一个蛋盒子并不会因为你对它大喊大叫就变成了一瓶牛奶”这句话也很棒。+1 - Lino
2
@DodgyCodeException 再次强调,类型 Object[]int[] 完全没有关系。请查看我对答案所做的更新。int[] 的类型为 Object,因此 Object 数组可以容纳 int[] 条目。它还可以容纳一个 int[],然后是一个字符串、一个整数、一个 null,最后是一组 MilkBottles。因为在 Java 中,最终所有东西都是一个对象。但是数组类型是固定的,并且如前所述,两种类型的对象数组和 int 数组没有关系,也不相等,也不是“父”和“子”。 - GhostCat
@DodgyCodeException,你说的是这个问题。因为如下所述:第一个方法不知道元素类型是int[][]。List类型是List<int[]>,因此列表中的元素是整数数组。你可以轻松地将整数数组分配到对象数组的插槽中。 - GhostCat
2
@DodgyCodeException 或许这个链接能帮助理解? - Lino
1
@Eugene 这非常令人不悦...但我仍感到有趣。 - Lino
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接