Java 中多维数组的 ClassCastException
ClassCastException on Multi-Dimentional Arrays in Java
我试图理解以下代码块背后的执行逻辑:
Integer[][] mdArray = new Integer[][] { { 1, 2 }, { 3, 4 }, { 5, 6 },
{ 7, 8 } };
List<Integer[]> mdArrayList = new ArrayList<Integer[]>();
// Iterate through every row of mdArray
for (Integer[] obj : mdArray) {
mdArrayList.add(obj);
}
/* Throws ClassCastException because it cannot resolve the final array size?
*
* i.e. it is a proper RTError.
*
*/
Integer[][] toArray = (Integer[][]) (mdArrayList.toArray());
以上代码编译正常,但在执行最后一行时在运行时抛出 ClassCastException。我的理解是 JVM 无法在运行时执行此代码,因为即使 toArray() 丢弃了 mdArrayList 中的元素数组,目标类型也无法解析或提升为有效类型?
任何解释将不胜感激!我只是想了解是否必须避免或异常处理这种代码执行以输出更适合用户需求的内容。
尝试
Integer[][] toArray = mdArrayList.toArray(new Integer[mdArrayList.size()][]);
如果您不为 toArray
方法提供参数,则 return 类型将始终为 Object[]
,无论列表中内容的实际类型如何。
如果您确实提供了一个参数,您可以选择将其设为零长度数组 (new Integer[0][]
),在这种情况下,toArray
方法将创建一个相同的新数组类型;或者您可以提供一个大小正确的数组,然后 toArray
方法将使用该数组。后者比前者效率略高,但不是你需要太担心的事情。
你不应该选角。将 Integer[][]
传递给 toArray
。像
Integer[][] toArray = mdArrayList.toArray(new Integer[][] {});
System.out.println(Arrays.deepToString(toArray));
输出是
[[1, 2], [3, 4], [5, 6], [7, 8]]
我试图理解以下代码块背后的执行逻辑:
Integer[][] mdArray = new Integer[][] { { 1, 2 }, { 3, 4 }, { 5, 6 },
{ 7, 8 } };
List<Integer[]> mdArrayList = new ArrayList<Integer[]>();
// Iterate through every row of mdArray
for (Integer[] obj : mdArray) {
mdArrayList.add(obj);
}
/* Throws ClassCastException because it cannot resolve the final array size?
*
* i.e. it is a proper RTError.
*
*/
Integer[][] toArray = (Integer[][]) (mdArrayList.toArray());
以上代码编译正常,但在执行最后一行时在运行时抛出 ClassCastException。我的理解是 JVM 无法在运行时执行此代码,因为即使 toArray() 丢弃了 mdArrayList 中的元素数组,目标类型也无法解析或提升为有效类型?
任何解释将不胜感激!我只是想了解是否必须避免或异常处理这种代码执行以输出更适合用户需求的内容。
尝试
Integer[][] toArray = mdArrayList.toArray(new Integer[mdArrayList.size()][]);
如果您不为 toArray
方法提供参数,则 return 类型将始终为 Object[]
,无论列表中内容的实际类型如何。
如果您确实提供了一个参数,您可以选择将其设为零长度数组 (new Integer[0][]
),在这种情况下,toArray
方法将创建一个相同的新数组类型;或者您可以提供一个大小正确的数组,然后 toArray
方法将使用该数组。后者比前者效率略高,但不是你需要太担心的事情。
你不应该选角。将 Integer[][]
传递给 toArray
。像
Integer[][] toArray = mdArrayList.toArray(new Integer[][] {});
System.out.println(Arrays.deepToString(toArray));
输出是
[[1, 2], [3, 4], [5, 6], [7, 8]]