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

Posted

技术标签:

【中文标题】如何在 java 中将 Object[] 转换为 int[]【英文标题】:How to cast Object[] into int[] in java 【发布时间】:2020-12-15 13:06:14 【问题描述】:

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

Object[] objects = pq.toArray();

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

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

但它说:

Cannot cast from Object[] to int[]

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

所有集合都提供了一个替代的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)));

【讨论】:

PriorityQueue 类型中的 toArray(T[]) 方法不适用于参数 (Integer[]::new) 这个表达式的目标类型必须是函数式接口 数组构造函数的参数列表不兼容。预期 (int),但找到 () @stridecolossus 抱歉,从 Java 11 开始没有发现您指的是 docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/…(我仍在 Java 8 世界中,并且在非常旧的接口中拥有类似的新方法从我身边经过)。现在说得通了。 @fluffy 是的,我刚刚意识到我将旧版本的 JavaDoc 发布到更令人困惑的问题上,呵呵!相应地修改答案。【参考方案2】:

这不是你可以轻易做到的。

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

问题是,变量“objects”仍然存在。在 Object[] 中,您可以放置​​任何对象。所以在你的演员表之后,有人可能会做这样的事情:

objects[0] = "some string";

那么应该怎么办呢?你的 int[] 是否应该突然无效,因为它现在包含一个字符串?是否不允许将除整数以外的内容输入到通常允许的objects 中?

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

java-map-an-array-of-strings-to-an-array-of-integers

所以,简单的转换在这里没有帮助。

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

【讨论】:

【参考方案3】:

由于PriorityQueue 实现了Collection,您可以使用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]

【讨论】:

以上是关于如何在 java 中将 Object[] 转换为 int[]的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java中将对象数组转换为字符串数组

在 Java 中将 List<Object> 转换为 String[]

在Java中将String Object转换为Jackson

如何在 JavaScript 中将 Object 转换为 Array [] 键值对

如何在 C# 中将 List<object> 转换为 Hashtable?

在 Java 中将 POJO 转换为表单数据