繁体   English   中英

将二维整数数组从 Clojure 传递到 Java

[英]Passing a 2D array of Integers into Java from Clojure

在我的 Java 库中,我有一个 function

void f(Integer[][] grid) {

我想从 Clojure 调用它

(f (to-array-2d
       [[1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 1]
       [0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0]]) )

问题是,Clojure 似乎将数据放入通用 Object class 中。 虽然我的函数需要整数

错误信息:

实际:java.lang.ClassCastException:class [[Ljava.lang.Object; 不能转换为 class [[Ljava.lang.Integer; ([[Ljava.lang.Object; 和 [[Ljava.lang.Integer; 在模块 java.base 的'loader'bootstrap)

我如何告诉 Clojure 将这些放入整数? 还是我必须使用 Object 编写我的 Java?

你可以这样做:

(defn into-2d-array
  [cast-fn matrix]
  (into-array
    (map (fn [array]
           (into-array (map cast-fn array)))
         matrix)))
(into-2d-array  double [[1 2 3] [4 5 6]])
;; => #object["[[Ljava.lang.Double;" 0xf49bc94 "[[Ljava.lang.Double;@f49bc94"]

(into-2d-array  int [[1 2 3] [4 5 6]])
;; => #object["[[Ljava.lang.Integer;" 0x2bf30c58 "[[Ljava.lang.Integer;@2bf30c58"]

我从来没有机会尝试这个。 制作了一些演示代码来展示它的实际效果:

(ns tst.demo.core
  (:use tupelo.core tupelo.test))

(dotest
  (let [i0 (into-array Short/TYPE (range 3))]
    (newline)
    (spyx i0)
    (spyxx (first i0)))
  (let [i1 (short-array (range 3))]
    (newline)
    (spyx i1)
    (spyxx (first i1)))
  (let [data (mapv short-array [[1 2 3] [4 5]])
        i2 (into-array  data)]
    (newline)
    (spyx i2)
    (spyx (first i2))
    (spyxx (first (first i2))))
  )

结果:

-------------------------------
   Clojure 1.10.1    Java 13
-------------------------------

Testing tst.demo.core

i0 => #object["[S" 0x3d945944 "[S@3d945944"]
(first i0) => <#java.lang.Short 0>

i1 => #object["[S" 0x6ae6df4a "[S@6ae6df4a"]
(first i1) => <#java.lang.Short 0>

i2 => #object["[[S" 0xf610578 "[[S@f610578"]
(first i2) => #object["[S" 0x4b0e6ed6 "[S@4b0e6ed6"]
(first (first i2)) => <#java.lang.Short 1>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM