繁体   English   中英

是对象[] $1d = { 新对象[0]; } 考虑一个二维数组?

[英]Is Object[] $1d = { new Object[0]; } considered a 2D array?

鉴于 Java 中的二维数组只是一个包含另一个数组的一维数组,那么Object[] 1d = { new Object[0]; }是否正确? Object[] 1d = { new Object[0]; }是一个二维数组? 如果是这样,为什么我不能这样做?

   Object[] $1d = { new Object[0] };
   Object[][] $2d = $1d; // compiler error

编辑对不起,只是为了方便起见选择了变量名。 改变了

首先,存在一些小的语法问题,并且您的代码无论如何都无法编译。 也就是说,修复后:

Object[] d = { new Object[0] };
Object[][] dd = d; // compiler error

第 2 行的编译器错误在那里,因为编译器不知道d是一个二维数组。 您将其声明为一维数组,您知道它实际上是一个二维数组,但编译器不可能知道。 如果您希望分配工作,您需要将d数组也声明为Object[][] 这样编译器就知道并且总能证明该变量是一个“2D”数组。

不,这根本不正确。

首先, 1d2d是双重文字,因此它们不是正确的 Java 标识符,必须更正。

接下来,假设使用了适当的变量名:

Object[] d1 = {new Object[1]};
Object[] arr = (Object[]) d1[0]; // casting is needed
System.out.println(Arrays.toString((Object[])(d1[0]))); // casting is needed
// output: [null]
System.out.println(arr[0]);
// output: null

这里d1被声明为任何对象的数组,不一定是Object[] 即使d1不包含任何其他非数组对象,编译器也会将其内容视为普通Object 如果需要将d1视为数组,则需要显式转换,如上所示。

因此,声明Object[][] d2 = d1; 显然是不正确的,因为编译器“不知道” Object[]的内容是另一个数组。

此外,即使是显式转换也不会成功Object[][] d2 = (Object[][]) d1; ClassCastException

线程“主”中的异常 java.lang.ClassCastException: class [Ljava.lang.Object; 不能转换为 class [[Ljava.lang.Object; ([Ljava.lang.Object; 和 [[Ljava.lang.Object; 在模块 java.base 的“加载程序”中)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM