在Clojure中使用类型提示获取Java返回值

mik*_*era 11 java clojure type-hinting

我正在研究一些Java/Clojure互操作性,并遇到以下代码的反射警告:

(defn load-image [resource-name]
  (javax.imageio.ImageIO/read 
    (.getResource 
      (class javax.imageio.ImageIO) 
      resource-name)))

=> Reflection warning, clojure/repl.clj:37 - reference to field read can't be resolved.
Run Code Online (Sandbox Code Playgroud)

我对此感到惊讶,因为getResource总是返回一个URL,因此我希望编译器在javax.imageio.ImageIO/read中使用适当的静态方法.

代码工作得很好BTW,所以很明显在运行时找到正确的方法.

所以有两个问题:

  1. 为什么这会返回反射警告?
  2. 我需要什么类型的提示来解决这个问题?

Pet*_*ans 4

AFAICS 与您的代码或编译无关。它是 REPL 的 source-fn 函数的一部分:

 ...
      (let [text (StringBuilder.)
            pbr (proxy [PushbackReader] [rdr]
                  (read [] (let [i (proxy-super read)]
                             (.append text (char i))
                             i)))]
 ...
Run Code Online (Sandbox Code Playgroud)

并用于在 REPL shell、AFAICT 中显示源代码。