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

时间:2019-07-16 21:09:38

标签: clojure type-hinting

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

(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。

3 个答案:

答案 0 :(得分:5)

这是CLJ-865。它不是特定于<textarea id="given" placeholder="Given"></textarea> <input type="text" id="result" placeholder="Result" list="resultAutoComplete"/> <datalist id="resultAutoComplete"> <option value="v">(v) Speed</option> <option value="ρ">(ρ) density</option> <option value="Eₚ">(Eₚ) Potential energy</option> </datalist> <button type="button" onClick="calculateAnswer();">result</button> <p><a id="Rho" onClick="RhoAdd();" style="cursor: pointer;">ρ</a></p> <button id="Example" onClick="Examplefill();" style="cursor: pointer;">ρ</button> <p>Answer: <b id="answer"></b></p> <div style="background-color: #ACACAC; width: 100%;"><ins style="color: #ED141A; font-size: 20px; margin-left: 5px;" id="errorAlerts"></ins></div> 的:在任何形式的宏调用中添加类型提示通常会丢弃它。一种典型的解决方法是您的答案:定义一个本地保存值,人为地引入非宏形式进行注释。

答案 1 :(得分:1)

我不确定原因,但请注意可以通过调用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.

答案 2 :(得分:1)

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

(let [m (with-out-str (print "hi"))]
  (IllegalArgumentException.
   ^String m ))
相关问题