【问题标题】:aget returns a java object when applied to a `make-array` array当应用于“make-array”数组时,get 返回一个 java 对象
【发布时间】:2016-07-29 13:46:12
【问题描述】:

我希望以下代码返回 (0,0) 值。然而我得到了一个 java 对象

(let [axs (make-array Long 5 5 0)]                                                                                                                                                                                                                                              
  (aget axs 0 0))        

我在尝试改变索引 (0,0) 时也遇到了类型不匹配

(let [axs (make-array Long 5 5 0)]                                                                                                                                                                                                                                              
  (aset axs 0 0 1))  

我希望将 Long[5][5] java 数组初始化为零。我在这里错过了什么?

谢谢

【问题讨论】:

  • 首先你的数组没有被初始化,其次如果你想要一个二维数组,你必须删除你的make-array末尾的0

标签: clojure clojure-java-interop


【解决方案1】:

make-array 的第三个参数不会用零初始化您的数组,而是添加第三个数组维度,其大小等于零。结果,数组的大小也为零。要解决此问题,请按如下方式创建数组:

(make-array Long/TYPE 5 5)

这将创建 primitive longs 数组 并将其初始化为零。

【讨论】:

  • Long/TYPE 是表示原始 long 的类文字(与 java.lang.Long 表示包装类或盒子相反),因此 (make-array Long/TYPE 5 5) 确实 创建了一个二维数组原始长。
  • @sw1nn 没错!我确信 (type (make-array Long/TYPE 5 5)) 在 REPL 中为我返回了 [[Ljava.lang.Long;,但实际上它返回了 [[J。可能,我搞砸了。我已将答案还原为初始版本
猜你喜欢
  • 2017-12-05
  • 2013-06-04
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 2022-11-21
相关资源
最近更新 更多