【问题标题】:How to cast a Java class instance to Object[] in Clojure如何在 Clojure 中将 Java 类实例转换为 Object[]
【发布时间】:2019-07-29 12:42:03
【问题描述】:

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

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

我正在使用 Clojure,但不知道如何将该类转换为 Java 数组。

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

【问题讨论】:

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

    【讨论】:

      猜你喜欢
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      • 2011-04-22
      • 1970-01-01
      • 2013-04-01
      相关资源
      最近更新 更多