如何在 java 中将 Object[] 转换为 int[]

How to cast Object[] into int[] in java

在整数优先级队列中使用方法 .toArray() 后,我得到一个对象数组,如下所示:

Object[] objects = pq.toArray();

但是,我需要数组为 int[]。我试过:

int [] arr = (int[]) objects;

但它说:

Cannot cast from Object[] to int[]

我怎样才能做到这一点?

所有集合都提供了另​​一种 toArray 指定元素类型的实现:

Integer[] objects = pq.toArray(Integer[]::new);

注意这需要 Java v11 或更高版本

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collection.html#toArray(java.util.function.IntFunction)

请注意,在这种情况下,结果数组显然是整数 wrapper 对象,不知道这是否适合您的要求。

编辑 - 快速测试:

PriorityQueue<Integer> q = new PriorityQueue<>();
q.add(42);
System.out.println(Arrays.toString(q.toArray(Integer[]::new)));

这不是你能轻易做到的。

您可能知道 Object[] 实际上只是全是整数,这意味着应该可以转换它,对吧?

问题是,变量“objects”仍然存在。在 Object[] 中,您可以放置​​任何 Object。所以在你投完之后,有人可能会做类似的事情:

objects[0] = "some string";

那么接下来会发生什么?你的 int[] 是否应该突然无效,因为它现在包含一个字符串?是否应该不允许将整数以外的东西输入 objects 而通常允许这样做?

铸造只是意味着你指向同一件事,但看待它的方式不同。你需要做的是改造它。已经有答案了:

因此,简单的转换在这里无济于事。

更新:@stridecolossus 的回答可能和我链接到的答案一样好。

因为 PriorityQueue implements Collection, you can use a stream 迭代其元素并将它们映射到 int:

PriorityQueue<Integer> pq = new PriorityQueue<>(Arrays.asList(1, 2, 5));

int[] arr = pq.stream().mapToInt(Integer::intValue).toArray();

System.out.println(Arrays.toString(arr)); // [1, 2, 5]