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/