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

chr*_*ris 2 clojure type-hinting

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

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

(IllegalArgumentException.
  ^String (with-out-str (print "hi")))
Run Code Online (Sandbox Code Playgroud)

警告:

Reflection warning ... 
call to java.lang.IllegalArgumentException ctor 
can't be resolved.
Run Code Online (Sandbox Code Playgroud)

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

ama*_*loy 5

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