首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的不同类型的多维数组?

Java中的不同类型的多维数组?
EN

Stack Overflow用户
提问于 2021-02-15 10:38:54
回答 1查看 114关注 0票数 0

我正在使用Java11 (+ IntelliJ集成开发环境)。我的代码通过JNI从3D方C++库中检索多维数组。

我的代码如下所示:

代码语言:javascript
复制
Object[][][] param1 = {{{"somevalue"}}};
Object[] param2 = param1
Object[][][] param3 = (Object[][][])param2; //OK
Object[][][] result1 = SomeNativeLibrary.someNativeCall(param1);
Object someResult = result1[0][0][4]; //OK
Object[] result2 = result1;
Object[][][] result3 = (Object[][][])result2;  //CastException

通过我的调试器,我可以清楚地看到param1和result1的结构是不同的(尽管两者都被假定为三维数组):

对于param1:{Object[1][][]} -> {Object[1][]} -> {Object{1}}

对于result1:{Object[1]} -> {Object[1]} -> {Object[4]}

尽管从param2到param3的强制转换没有问题,但从result2到result3的强制转换失败,并显示了

代码语言:javascript
复制
 "java.lang.CastException: class [Ljava.lang.Object; cannot be case to class [[[Ljava.lang.Object" (notice the single square-bracket versus triple square-bracket before the "L").

我面临的问题是,我通过某个远程处理框架返回result1。所以我最终(在远程处理的客户端/调用端)得到了一个一维数组,就像上面的result2。

1)如何将result2转换回Object[]数组,以便更容易地访问数据?

2)为什么可以从param2转换到param3,但不能从result2转换到result3?

EN

回答 1

Stack Overflow用户

发布于 2021-02-15 21:59:16

查找SomeNativeLibrary.someNativeCall(param1)的文档,并检查它实际返回的内容。CastException显示它在类文件中被声明为对象的一维数组,因此您需要将其视为一维数组。

如果它最初是一个多维数组,那么它很可能在Java语言中表示为一维数组,元素(x,y,z)位于索引x*Y*Z + y*Z + z处,其中Y是y方向上的维数,Z是z方向上的维数。但请查看文档以确保以这种方式使用它。

Java中的多维数组不是这样构造的,而是作为指向其他数组的指针的一维数组。因此不能直接将其转换为多维Java数组。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66202113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档