如何在Clojure中将Java类实例转换为Object []

时间:2019-03-07 15:08:45

标签: java clojure clojure-java-interop

我正在使用实现自己的Array类的JDBC库。为了使用所述Array,他们将其转换为Object []。

https://github.com/housepower/ClickHouse-Native-JDBC/blob/master/src/test/java/com/github/housepower/jdbc/QueryComplexTypeITest.java#L120

我正在使用Clojure,无法弄清楚如何将该类转换为Java Array。

(vec (.getArray results "array-row"))
Unable to convert: class com.github.housepower.jdbc.ClickHouseArray to Object[]

2 个答案:

答案 0 :(得分:0)

难道Java代码不是在调用.getArray方法,然后将结果转换为Object[]数组吗?查看com.github.housepower.jdbc.ClickHouseArray的来源,似乎是通过java.sql.Array扩展了com.github.housepower.jdbc.wrapper.SQLArray,而Object[]不是*e。对吧?

Clojure只会执行运行时反射来解析对象上的方法,因此您无需担心强制转换。除了您收到的例外情况之外,可能还有其他信息吗?尝试使用export async function displayDialogAsync (dialogUrl: string): Promise<void> { return new Promise<void>(resolve => { const dialogClosed = async (_: any): Promise<void> => { // do whatever you need when the dialog is closed resolve(); }; Office.context.ui.displayDialogAsync(url, dialogOptions, (result: Office.AsyncResult) => { dialog = result.value; dialog.addEventHandler(Office.EventType.DialogEventReceived, dialogClosed); }); }); } 来获取REPL中的最后一个异常。如果您可以发布更完整的测试案例,那么我们可能会更好地解决问题?

答案 1 :(得分:0)

我相信您可以尝试迭代该数组并手动组合结果:

(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))))))