当前位置: 首页 > 知识库问答 >
问题:

如何将对象数组转换为整数数组数组

仉联
2023-03-14

这是一个有点人为的例子,以了解我遇到的情况,但基本上,我有一个对象数组,实际上包含整数数组,我试图将它转换为这样的数组。下面是模拟这种情况的代码片段:

Object[] foo = new Object[3];
foo[0] = new int[] { 1, 2, 3 };
foo[1] = new int[] { 4, 5, 6 };
foo[2] = new int[] { 7, 8, 9 };
int[][] bar = (int[][]) foo;

共有1个答案

慕容玉堂
2023-03-14

不能通过强制转换来更改Java对象的内在类型。包含数组的。对象的类型在分配对象时是固定的,并且不能更改。

因此,将对象[]强制转换为int[][]是行不通的。

在本例中,虽然int[][]object[]的子类型,但这不足以在运行时允许类型转换。JLS(5.5.3.运行时检查的强制转换)中的实际规则如下:

>

  • TC和RC是相同的基元类型。

    TC和RC是引用类型,类型RC可以通过这些用于强制转换的运行时规则的递归应用程序强制转换为TC。

    在本例中,TC是int[],RC是objectobject不能强制转换为int[]。因此,您得到了一个异常。

       Object[] foo = new Object[3];
       foo[0] = new Object();
       int[][] bar = /* foo */
       int[] mystery = bar[0];
    

    您的示例和我的示例的不同之处在于,foo实际上不是一个整数数组的数组,而在我的示例中它是。为什么VM看不到对象的“实际”类型?

    关键是静态类型(主要)是由编译器强制执行的,而不是由JVM强制执行的。虽然JVM(理论上)可以在运行时确定类型是否正常(如果不正常,则抛出异常),但编译器无法做到这一点,因为它通常无法确定类型是什么。

    不幸的是,实际上我并不是自己创建数组的。我是从另一个函数获得的,而对象[]而不是int[][]是我无法控制的某些序列化的副作用。

    Object[] foo = new Object[3];
    foo[0] = new int[] { 1, 2, 3 };
    foo[1] = new int[] { 4, 5, 6 };
    foo[2] = new int[] { 7, 8, 9 };
    ...
    int nine = ((int[]) (foo[2]))[2];
    

    Java中没有“相信我,它确实是一个int[][]”选项。

    如果这是序列化的副作用,那么序列化就会在某种意义上中断。当然,标准Java对象序列化协议/实现不会发生这种情况。这保留了对象的类型...除非您在ReadObject/WriteObject方法中显式重写它们。

  •  类似资料:
    • 问题内容: 以下代码有什么问题? 该代码在最后一行有以下错误: 线程“主”中的异常java.lang.ClassCastException:[Ljava.lang.Object; 无法转换为[Ljava.lang.Integer; 问题答案: 可以使用或。 在这里点击的原因是你不能将的数组视为的数组。是的子类型,但不是的子类型。 并且以下内容也不会给出。

    • 问题内容: 我正在使用以下方式读取文件: 我在这里发现。可以转换为吗?将转换为会占用更多空间吗? 编辑:我的文件包含数百万个整数,例如, 100000000 200000000 .....(使用普通的int文件写入)。我读到字节缓冲区。现在,我想将其包装到IntBuffer数组中。怎么做 ?我不想将每个字节转换为int。 问题答案: 您已经在注释中说过,您希望输入数组中的四个字节对应于输出数组中的

    • 问题内容: response->docs); ?> 输出以下内容: 如何将该对象转换为数组?我想输出以下内容: 这可能吗? 问题答案: 您应该查看get_object_vars,因为您的属性被声明为私有,所以您应该在类内部调用此方法并返回其结果。 注意,对于像字符串这样的原始数据类型,它会很好用,但是我不知道它在嵌套对象中的行为。 在您的情况下,您必须执行类似操作;

    • 问题内容: 转换的最佳方法是什么: 至: 问题答案: ECMAScript 6引入了易于填充的内容: 该方法用于将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。 数组的自身属性不会被复制,因为它无法枚举。 另外,您可以使用ES6 传播语法来达到相同的结果:

    • 问题内容: 因此基本上,用户是从扫描仪输入中输入序列。 等等。 它可以是任意长度,并且必须是整数。 我想将输入的字符串转换为整数数组。 所以会,就等 有什么提示和想法吗?我正在考虑实现获取先前的编号并将它们解析在一起,并将其应用于数组中的当前可用插槽。但是我不太确定如何编写代码。 问题答案: 您可以从扫描仪中读取整个输入行,然后将其分开,然后得到一个,将每个数字解析为与索引一对一匹配的…(假设输入

    • 问题内容: 转换的最佳方法是什么: 至: 问题答案: ECMAScript 6引入了易于填充的内容: 该方法用于将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。 数组的自身属性不会被复制,因为它无法枚举。 另外,您可以使用ES6 传播语法来达到相同的结果:

    • 问题内容: 我碰到SimpleXML对象转换为阵列的这种功能在这里: 因此,我对XML字符串的采用类似于: 它工作得很好,但似乎有点黑吗?有没有更有效/更强大的方法来做到这一点? 我知道SimpleXML对象与数组足够接近,因为它利用了PHP中的ArrayAccess接口,但与多维数组(即循环)一起使用时,仍然不能很好地工作。 谢谢大家的帮助 问题答案: 我在PHP手册注释中找到了这个: 它可以帮

    • 问题内容: 我正在尝试将数组转换为对象,并且我快到了。 这是我的输入数组: 这是我当前的输出对象: 这是我想要的输出对象: 这是我当前的代码: 问题答案: 你不能那样做。 不是有效的JavaScript对象。 javascript中的对象是键值对。看看你的情况如何,然后是冒号,然后是数字?的是,号码是的。 如果执行此操作,则将无法访问属性。 这是Firefox控制台的结果: