[英]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.