关于Java interop:Clojure的:gen-class和double数组

Clojure's :gen-class and double arrays

我正在尝试:gen-class一个fn,该fn需要一个Double的2D数组作为输入。我已经在此处看到有关类似主题的帖子和解决方案,但仍然无法提供有效的解决方案。

1
2
3
4
5
6
7
(ns gui.heatmap
  (:gen-class
    :name gui.Heatmap
    :methods [[heat-map2 ["[[D"] org.jfree.chart.JFreeChart]]))

(defn foo [dbl-array]
  ...)

我在输入上使用type的基础上使用了"[[D"。这可以很好地编译成.class文件。

现在,当我移至另一个.clj文件时,将显示以下内容。

1
2
3
4
5
6
7
8
9
10
11
(ns ...
  (import (gui.Heatmap)))

(defn bar [args]
  ...
  (.foo
    (into-array
      (vector
        (double-array <list of numbers>)
        (double-array <list of numbers>)
        (double-array <list of numbers>)))))

当我从repl调用bar时,出现以下错误:

java.lang.IllegalArgumentException:找不到匹配的字段:类[[D

有什么想法吗?


您缺少该对象。 (.foo (into-array ...))(.foo (Heatmap.) (into-array...))

注意,您还应该require您的gui.Heatmap名称空间。否则,如果...名称空间是在gui.Heatmap之前编译的,则可能会遇到麻烦。然后导入失败,因为还没有生成该类。添加require将解决此问题。

编辑:

为了澄清事物。

  • 修复丢失的物体
  • 添加要求
  • 修复前缀(dbyrne可以很好地捕获!)
  • 修复:import子句(也是错误的)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(ns gui.heatmap
  (:gen-class
    :name gui.Heatmap
    :methods [[heat-map2 ["[[D"] org.jfree.chart.JFreeChart]]))

(defn -foo [dbl-array]
  ...)

(ns ...
  (import gui.Heatmap))

(defn bar [args]
  ...
  (.foo
    (Heatmap.)
    (into-array
      (vector
        (double-array )
        (double-array )
        (double-array )))))


Kotarak的回答很好。但是,另一个问题是您需要将函数命名为-foo而不是foo。要么更改:gen-class内的:prefix