尽管在 Clojure 中对 Java 构造函数进行了类型提示,但反射警告
Reflection warning despite type hint to Java constructor in Clojure
尽管有类型提示,但以下代码给了我一个反射警告。
(set! *warn-on-reflection* true)
(IllegalArgumentException.
^String (with-out-str (print "hi")))
警告:
Reflection warning ...
call to java.lang.IllegalArgumentException ctor
can't be resolved.
代码已从一个更复杂的示例中提取和简化,在该示例中漂亮地打印任意对象是在 with-out-str
中执行的。我正在使用 Clojure 1.10.0.
我不确定原因,但我会注意到它可以通过调用 str
:
来修复
(IllegalArgumentException. (str (with-out-str (print "hi"))))
好像跟try
有关?:
(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.
Carcigenicate 对原因的洞察启发我尝试了以下也有效的方法。
(let [m (with-out-str (print "hi"))]
(IllegalArgumentException.
^String m ))
这是CLJ-865。它不特定于 with-out-str
:将类型提示添加到任何形式的宏调用通常会丢弃它。典型的解决方法是你的答案中的那个:定义一个本地保存值,人为地引入一个 non-macro 形式来注释。
尽管有类型提示,但以下代码给了我一个反射警告。
(set! *warn-on-reflection* true)
(IllegalArgumentException.
^String (with-out-str (print "hi")))
警告:
Reflection warning ...
call to java.lang.IllegalArgumentException ctor
can't be resolved.
代码已从一个更复杂的示例中提取和简化,在该示例中漂亮地打印任意对象是在 with-out-str
中执行的。我正在使用 Clojure 1.10.0.
我不确定原因,但我会注意到它可以通过调用 str
:
(IllegalArgumentException. (str (with-out-str (print "hi"))))
好像跟try
有关?:
(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.
Carcigenicate 对原因的洞察启发我尝试了以下也有效的方法。
(let [m (with-out-str (print "hi"))]
(IllegalArgumentException.
^String m ))
这是CLJ-865。它不特定于 with-out-str
:将类型提示添加到任何形式的宏调用通常会丢弃它。典型的解决方法是你的答案中的那个:定义一个本地保存值,人为地引入一个 non-macro 形式来注释。