为了解决使用JNI在C代码中创建的Object数组的故障,我创建了带有Object数组数组的纯Java代码,如下所示。 我想使用[] []运算符以二维对象数组(Object [] [])的方式访问此数组。但是,在将数组转换为Object [] []时,代码会崩溃,但会出现以下异常。
java.lang.ClassCastException:[Ljava.lang.Object;无法施展 [[Ljava.lang.Object
Object[] outerArray = new Object[3];
outerArray[0] = new Object[] {1,2,3,4,5};
outerArray[1] = new Object[] {10,20,30,40,50};
outerArray[2] = new Object[] {100,200,300,400,500};
Object o = ((Object[])outerArray[0])[0]; // (1) OK but awkward
Object[][] = (Object[][])outerArray; // (2) Runtime error!!
o = outerArray[0][0]; // (3) I want to do this
任何人都可以帮助我吗?
答案 0 :(得分:2)
在声明具有一个维度的数组时,然后在每个单元格中添加数组时,您需要构建它:
[ [][][] ] [ [][][] ] [ [][][] ]
使用[][]
无法访问,因为它只有1行,每个单元格都有另一行对象,因此需要使用"笨拙的强制转换"
如果您想要列结构:
[] [] []
[] [] []
[] [] []
它应该用这个创建:
Object[][] outerArray = new Object[3][5];
答案 1 :(得分:0)
创建数组时,它总是有一个类型。目的是保护您免受一类编程错误的影响,当存储在数组中的项目稍后被读取并且"使用"作为另一种类型(*)。您的数组类型为Object[].class
,您无法将其转换为Object[][].class
,因为数组中的对象为Object[]
。您也可以添加Integer
,并且系统不会抛出ArrayStoreException
,因为Integer
是Object
的子类型。
您可以创建(并声明)数组为Object[][]
或使用"尴尬"铸造。
(*)仍然会发生这种情况,直到运行时才知道
public class ArraysQuirks {
public static void main(String... args) {
String[] strings = {"a", "b", "c"};
Object[] objects = strings;
objects[0] = 1; // ArrayStoreException here
}
}
答案 2 :(得分:0)
Object[][] = (Object[][])outerArray; // (2) Runtime error!!
这里是一个语法Error.Object [] []意味着你将声明一个Object的多个数组。改变如下:
Object[][] temp= (Object[][])outerArray; //it works