反射警告-Clojure / Leiningen上的Java方法错误

时间:2019-06-02 11:55:38

标签: clojure

我是编码新手。我的第一个语言是Clojure。这是我关于stackoverflow的第一个问题。

我编写了一个Clj代码,在lein(Emacs / Cider)上测试了所有功能,并且想编译进行测试。但是Java方法返回了此错误消息:

(在项目文件夹的终端上):

aaron@debian:~/img-process$ lein check

Reflection warning, img_process/core.clj:25:30 - reference to field getWidth can't be resolved.

(以及getHeight,getRGB,setRGB,java.io.File,javax.imeageio.ImageIO,java.lang.String)

为什么lein看不到Java元素? 我该如何编译呢?

谢谢。

project.clj https://github.com/harununal/clj-x-ray-coloring/blob/master/project.clj

核心clj: https://github.com/harununal/clj-x-ray-coloring/tree/master/src/img_process

1 个答案:

答案 0 :(得分:1)

如果Clojure不能暗示Java对象的类型,则它会退回进行互操作的反射,这要慢得多。如果您使用:

(set! *warn-on-reflection* true)

然后,您也会在REPL上看到这些警告。如果您输入提示您的方法,那么Clojure可以看到这些类型并发出更好的代码。例如

(defn get-img-coords
  [^BufferedImage img]
  (for [y (range (.getHeight img))
        x (range (.getWidth img))]
    [x y]))

请注意,lein检查不是编译器,它相当于轻型短绒棉衣的lein等效项,也许可以检查这些警告和其他警告。