将二维整数数组从Clojure传递到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

在我的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[[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]])
是的,可以