从 Clojure 中类型特定的数组创建通用数组

Create generic array from type specific arrays in Clojure

我正在使用 Clojure 中的 JFreeChart 工作,遇到了一个我需要帮助的情况。

JFreeChart 的 DefaultXYDataset 有一个方法 addSeries,用于向图表添加系列。数据应该是一个包含 two arrays 的数组,它是特定类型的(双精度数组)。因此,我编写了以下代码,认为它可以工作,但我得到一个 ClassCastException class [Ljava.lang.Object; cannot be cast to class [[D ([Ljava.lang.Object; and [[D are in module java.base of loader 'bootstrap').

(doto _dataset
  (.addSeries "S1" (to-array (conj
                               []
                               (double-array (range 10))
                               (double-array (range 10))))))

看完后我意识到 to-array 将两个嵌套数组转换为 #object["[Ljava.lang.Object;" 0x491223e7 "[Ljava.lang.Object;@491223e7"] 而不是预期的 #object["[D" 0x4f5cf37 "[D@4f5cf37"] #object["[D" 0x6d895193 "[D@6d895193"]。有没有办法将它们组合成通用数组而不将它们转换为长数组?也许是 to-array 之外的另一种方法。欢迎任何其他建议。谢谢。

编辑:@bfabry 的答案会起作用,我可以使用 make-array 然后使用 aset-double 但这将导致我循环遍历两个序列并将它们的值分配给主数组。我试图避免这种情况,因为这两个数据集可能非常大,每个数据集甚至高达 300k items

那是二维数组,不是两个数组对象的数组。您需要使用 make-arrayaset-double 来制作您想要的数组。

user=> (class (make-array Double/TYPE 2 2))
[[D

https://clojuredocs.org/clojure.core/make-array