没有任何捷径可以很好地做到这一点吗?
丑陋的两个循环(一个循环读取 pmList,第二个循环添加到 markupArray)是唯一的选择(而不是 ArrayUtils)。
ArrayList<Double> pmList = new ArrayList<Double>();
pmList.add(0.1); // adding through a loop in real time.
pmList.add(0.1);
pmList.add(0.1);
pmList.add(0.1);
double[] markupArray = new double[pmList.size()];
arkupArray = pmList.toArray(markupArray); // This says The method toArray(T[]) in the type ArrayList<Double> is not applicable for the arguments (double[])
最佳答案
只需使用 Double[]
数组,而不是 double[]
,然后一切正常。如果提前知道列表的大小,也可以跳过列表,直接插入到数组中。遍历输入两次甚至可能是值得的:一次用于检索其大小,一次用于插入。
自动装箱仅适用于原始类型,不适用于原始类型数组。 double[]
数组不是 T[]
数组,因为类型参数 T
必须始终是 Object
.虽然 double
可以自动装箱为 T
(使用 T=Double
),但 double[]
不能自动装箱到 T[]
。
数组不自动装箱的原因可能是此操作的成本非常高:装箱数组意味着创建一个新数组并装箱每个元素。对于大型阵列,这会对性能造成巨大影响。您不希望隐式完成如此昂贵的操作,因此不会对数组进行自动装箱。此外,装箱一个完整的数组会产生一个新数组。因此,在写入新数组时,更改不会写入旧数组。所以你看,数组装箱存在一些语义问题,所以它不受支持。
如果您必须返回一个 double[]
数组,那么您必须编写自己的函数或使用像 Guava 这样的第三方库(参见 msandiford 的回答)。 Java Collections 框架没有用于对数组进行(取消)装箱的方法。
关于java - 为什么 java 中的 collection.toArray() 不支持自动装箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24428748/