【问题标题】:confused ,why Object[] objs (type of objs[i] is int[]) cant cast into int[][]困惑,为什么 Object[] objs(objs[i] 的类型是 int[])不能转换成 int[][]
【发布时间】:2019-09-28 03:49:07
【问题描述】:

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 实现的来源。
  • 你也不能用字符串列表来做。

标签: java arrays object casting


【解决方案1】:

这里:

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

由于类型擦除,这会创建一个实际的 Object 数组。 Objects 数组不是 int 数组数组,因此您不能强制转换它。一个装鸡蛋的盒子不会因为你对着它大喊“看哪,变成一个瓶子”而变成一个装牛奶的瓶子。

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

但是在这里:

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

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

仅作记录:您可能更喜欢

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

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

【讨论】:

  • 除了是一个伟大而清晰的答案之外,一盒鸡蛋不会因为你尖叫而变成一瓶牛奶 +1
  • 您能否详细说明“对象数组不是 int 数组数组”的断言?为什么不?我们经常被告知 Java 数组是一个对象。那么为什么数组数组不也是对象数组呢?
  • @DodgyCodeException 同样,Object[]int[] 类型完全相关。请参阅我对答案所做的更新。 int[] 具有 Object 类型,因此 Object 数组可以保存 int[] 条目。它还可以包含一个int[],然后是一个String,然后是一个Integer,然后是null,然后是一个MilkBottles 数组。因为Java中的任何东西,归根结底都是一个对象。但是数组类型是固定的,如三遍所说:Object数组和int数组这两种类型相关或相等或“父”和“子”。
  • @DodgyCodeException 也许this 有助于理解?
  • @Eugene 这很令人不快……但我还是觉得好笑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
相关资源
最近更新 更多