如何在不进行任何修改或转换的情况下直接将Object数组强制转换为Integer数组?
如何在不进行任何修改或转换的情况下直接将Object数组强制转换为Integer数组?
兄弟,很遗憾地告诉你——完全没有办法做到这一点,哪怕用反射也不行。这不是你代码写得有问题,而是Java的数组类型机制从根上就不允许这么干。
我给你掰扯清楚底层逻辑:
- Java里数组的运行时类型是在创建那一刻就固定死的。你一开始创建的是
new Object[count],这个数组的运行时类型就是[Ljava.lang.Object;(也就是Object[]的内部JVM表示),不管你后来往里面塞多少Integer对象,这个数组本身的类型永远不会改变。 Integer[]的运行时类型是[Ljava.lang.Integer;,这两个是完全独立的类,就像你不能把String强转成Integer一样,它们的数组类型也没法直接互转。所以你不管用(Integer[]) array还是Integer[].class.cast(array)都会抛出ClassCastException,这是JVM的类型安全检查在起作用,防止你破坏数组的类型约束。- 可能你会疑惑:数组里的元素都是Integer了,为什么还不能转?因为Java数组不仅要保证元素类型合法,还要维护自身的容器类型——Object[]允许你往后随时塞个String进去,但Integer[]绝对不允许这种操作,所以JVM必须严格区分这两种数组类型,不可能让你把一个Object[]直接“变身”成Integer[]。
哪怕你想动用反射歪招也没用:数组的类型是JVM层面的元数据,一旦创建就无法修改,反射也做不到篡改这部分信息。
如果实在要得到Integer[]类型的数组,唯一可行的办法就是做一次元素复制(虽然这是你不想用的方式),比如用Arrays.copyOf:
Integer[] intArray = Arrays.copyOf(array, array.length, Integer[].class);
或者手动循环遍历复制,除此之外没有其他途径。
备注:内容来源于stack exchange,提问作者Max Trunnikov
相关产品推荐
相关产品推荐

