Java中多维数组的ClassCastException

3

我试图理解以下代码块的执行逻辑:

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,目标类型也无法解析或提升为有效类型? 任何解释都将不胜感激!我只是想了解这种代码执行是否必须避免或处理异常以输出更适合用户需求的内容。

List.toArray 返回一个 Object[]。它怎么可能返回其他东西呢? - Boris the Spider
@BoristheSpider 是的,我知道它会这样做。我的问题是它如何决定将其解析为 MD 数组。感谢您的评论。 - ha9u63a7
Java中不存在MD数组。 - Boris the Spider
@BoristheSpider MD数组是多维数组。在Java中,您可以使用myArray[][]表示2-D(因此是多维的)。无论如何,我已经得到了我的解释...谢谢。 - ha9u63a7
不是的,它是一个 int[] 数组。它是“锯齿形”的。它不是一个 MD 数组。 - Boris the Spider
感谢大家对于数组和集合的提醒。我选择了Elliot的答案,因为他使用了deepToString()方法(我以前从未接触过!!!)。谢谢@ElliotFrisch。 - ha9u63a7
2个回答

4
你不应该进行强制类型转换。将一个Integer[][]传递给toArray方法。示例如下:
Integer[][] toArray = mdArrayList.toArray(new Integer[][] {});
System.out.println(Arrays.deepToString(toArray));

输出结果为

[[1, 2], [3, 4], [5, 6], [7, 8]]

或者 Integer[][]::new - Boris the Spider
@BoristheSpider 上述代码在Java7中同样适用,但是这是在四月份... :) - Elliott Frisch
@ElliottFrisch 不错的解决方案 - 简单易懂,点赞 :) - ha9u63a7

2

尝试

Integer[][] toArray = mdArrayList.toArray(new Integer[mdArrayList.size()][]);

如果你不给toArray方法提供参数,无论列表中实际类型是什么,返回类型都将始终为Object[]
如果你提供了参数,你可以选择将其设置为零长度数组(new Integer[0][]),这样toArray方法将创建一个相同类型的新数组;或者你可以提供一个正确大小的数组,然后toArray方法将使用该数组。后者比前者略微更有效,但这并不是你需要过多担心的事情。

很好。感谢您提供的解释,不仅告诉了我需要修复什么,还让我重新阅读了一遍关于toArray(Object[] obj)的API文档。文档中指出,如果没有指定类型和大小,它将返回默认的Object[] - 就在我以为我已经读完所有内容时。 - ha9u63a7

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