尽管对Clojure中的Java构造函数有类型提示,但仍存在反射警告

Reflection warning despite type hint to Java constructor in Clojure

尽管有提示类型,以下代码也给了我一个反射警告。

1
2
3
4
(set! *warn-on-reflection* true)

(IllegalArgumentException.
  ^String (with-out-str (print"hi")))

警告:

1
2
3
Reflection warning ...
call to java.lang.IllegalArgumentException ctor
can't be resolved.

该代码已从一个更复杂的示例中提取并简化了,该示例在with-out-str内执行任意对象的漂亮打印。 我正在使用Clojure 1.10.0。


这是CLJ-865。 它不是特定于with-out-str的:在任何形式的宏调用中添加类型提示通常会丢弃它。 典型的解决方法是您的答案:定义一个本地保存值,人为地引入非宏形式进行注释。


致癌基因对原因的洞察力促使我尝试了以下同样有效的方法。

1
2
3
(let [m (with-out-str (print"hi"))]
  (IllegalArgumentException.
   ^String m ))

我不确定原因,但我会注意到可以通过调用str来解决:

1
(IllegalArgumentException. (str (with-out-str (print"hi"))))

似乎与try有关?

1
2
3
4
5
(set! *warn-on-reflection* true)

(IllegalArgumentException. ^String (try"" (finally"")))

Reflection warning, C:\\Users\\slomi\\AppData\\Local\\Temp\\form-init3916067866461493959.clj:3:1 - call to java.lang.IllegalArgumentException ctor can't be resolved.