将二维整数数组从Clojure传递到Java
在我的Java库中,我有一个函数将二维整数数组从Clojure传递到Java,java,clojure,clojure-java-interop,Java,Clojure,Clojure Java Interop,在我的Java库中,我有一个函数 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似乎正在将数据放入通用对象类中。而我的函数需要整数 错误消息: 实际值:java.lang.ClassCastException:class[[Lj
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似乎正在将数据放入通用对象类中。而我的函数需要整数
错误消息:
实际值:java.lang.ClassCastException:class[[Ljava.lang.Object;
无法强制转换为类[[Ljava.lang.Integer;([[Ljava.lang.Object;
和[[Ljava.lang.Integer;位于加载程序的模块java.base中
'引导')
我如何告诉Clojure将这些转换成整数?或者我必须使用Object编写Java?您可以这样做:
(defn-into-2d-array
[铸造fn矩阵]
(进入阵列)
(地图(fn[阵列]
(进入数组(映射投射fn数组)))
(矩阵)
(插入二维阵列双[[1 2 3][4 5 6]]
=>#对象[”[[Ljava.lang.Double;“0xf49bc94”[[Ljava.lang.Double;@f49bc94]
(into-2d-array int[[1 2 3][4 5 6]]
=>#对象[”[[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>
-------------------------------
Clojure 1.10.1 Java 13
-------------------------------
测试tst.demo.core
i0=>#对象[“[S”0x3d945944”[S@3d945944"]
(第一i0)=>
i1=>#对象[“[S”0x6ae6df4a”[S@6ae6df4a"]
(第一i1)=>
i2=>#对象[“[[S”0xf610578”[[S@f610578"]
(第一个i2)=>#对象[“[S”0x4b0e6ed6”[S@4b0e6ed6"]
(第一(第一i2))=>
未测试:(放入数组中^“[[Ljava.lang.Integer”(映射int数组[[1 0][0 1]])
是的,可以