【问题标题】:How to cast a Java class instance to Object[] in Clojure如何在 Clojure 中将 Java 类实例转换为 Object[]
【发布时间】:2019-07-29 12:42:03
【问题描述】:
【问题讨论】:
-
This 建议您需要执行类似(into-array String (.getArray (.getArray results "array-row"))) 的操作。请注意对.getArray 的第二次调用,然后是通过into-array 进行的“演员”。我会发布一个答案,但我无法对此进行测试。
标签:
java
clojure
clojure-java-interop
【解决方案1】:
Java 代码不是在调用.getArray 方法,并将结果转换为Object[] 数组,而不是相反吗?查看com.github.housepower.jdbc.ClickHouseArray 的来源,它似乎通过com.github.housepower.jdbc.wrapper.SQLArray 扩展java.sql.Array,这不是Object[]。对吧?
Clojure 只会执行运行时反射来解析对象上的方法,因此您不必担心强制转换。您得到的异常中可能有更多信息?尝试使用*e 来获取 REPL 中的最后一个异常。如果您可以发布更完整的测试用例,我们可能会更好地了解问题?
【解决方案2】:
我相信您可以尝试迭代该数组并手动组合结果:
(let [array (.getArray results "array-row")]
(for [item array]
(turn-item-into-a-map item)))
或者只是
(mapv turn-item-into-a-map jdbc-array)
如果您不想转换项目,请使用identity 函数。
即使这样的数组不支持迭代,您仍然可以通过循环/递归中的索引来访问其项目:
(let [array (get-jdbc-array...)
size (.count array)]
(loop [i 0
result []]
(if (= i size)
result
(let [item (.get array i)]
(recur (inc i) (conj result item))))))