在 java 中将基元类型数组转换为对象数组

2022-09-01 00:56:51

为什么我不能在java中执行此操作?

Object[] o = (Object[])(new int[]{0,1,2,3.14,4});

我有一个方法,它接收一个对象,然后将其表示为字符串,但取决于他的类型(基元,基元包装器,数组等)。当我创建一个单元测试时,我正在将一个数组作为Object传递,这是OK的,但是当我执行该对象到Object[]的强制转换时,我得到了ClassCastException。这只发生在基元类型数组中。有没有办法避免这种行为?如果没有,有人可以解释一下Java虚拟机上这种行为的原因是什么。

任何帮助都非常感谢。


答案 1

这是一个简单的单行:

Double[] objects = ArrayUtils.toObject(primitives);

您需要导入 Apache commons-lang3

import org.apache.commons.lang3.ArrayUtils;

答案 2

在 Java 中,基元类型和引用类型是两个不同的世界。这反映了数组:基元数组不是对象数组,这就是您无法强制转换的原因。

以下是问题中解决方案的更简单版本:

private Object[] getArray(Object val){
    if (val instanceof Object[])
       return (Object[])val;
    int arrlength = Array.getLength(val);
    Object[] outputArray = new Object[arrlength];
    for(int i = 0; i < arrlength; ++i){
       outputArray[i] = Array.get(val, i);
    }
    return outputArray;
}

当他们有时决定向 VM 添加新的基元类型时,这仍然有效。

当然,您可能希望始终进行复制,不仅在原始情况下,然后它变得更加简单:

private Object[] getArray(Object val){
    int arrlength = Array.getLength(val);
    Object[] outputArray = new Object[arrlength];
    for(int i = 0; i < arrlength; ++i){
       outputArray[i] = Array.get(val, i);
    }
    return outputArray;
}

当然,这不是铸造,而是转换