java - 困惑,为什么 Object[] objs(objs[i] 的类型是 int[])不能转换为 int[][]

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

为什么会抛出异常?

最佳答案

这里:

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

由于类型删除,这个创建了一个实际的 Object 数组。对象数组不是 int 数组的数组,因此您不能强制转换它。一盒鸡蛋不会因为你对着它尖叫“看哪,变成一瓶奶”就变成一瓶牛奶。

要真正说明这一点:上面的调用不知道要使用的确切类型,所以它必须求助于基本的默认 Object[]。因为 int[] 是 Object 类型,所以 list 方法可以将这些数组存储到结果数组中。一个对象数组,每个对象都是一个int数组。

但是在这里:

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

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

郑重声明:您可能更喜欢

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

提供一个“已经确定大小”的数组是早期遗留下来的,一般来说,在 2019 年,您更喜欢传递一个空数组。

关于java - 困惑,为什么 Object[] objs(objs[i] 的类型是 int[])不能转换为 int[][],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56074145/

相关文章:

java - 如何通过定位同一父项的子项 B 来遍历特定的子项 A?

java - 使用通配符和类型化泛型会生成 "is not applicable for the arguments"错误

java - 用 Spoon 在方法中生成一个类

javascript - 提取具有最大属性值的数组元素

javascript - 使用groupBy时向JS中的对象添加值

Java:ResultSet getString() 因环境而异

arrays - 如何制作一个函数,将协议(protocol)中定义的任何函数作为其参数?

python - 如何在 Python 中获取 2 个字典列表的并集

c++ - 指针数组成员变量的返回元素

javascript - 如何将文本分配给对象属性