Java Clojure中函数的类型提示

Java Clojure中函数的类型提示,java,reflection,function,clojure,type-hinting,Java,Reflection,Function,Clojure,Type Hinting,我试图解决Clojure中的一个反射警告,它似乎是由于对普通Java对象的函数返回值缺乏类型推断而导致的 演示此问题的简单示例代码: (set! *warn-on-reflection* true) (defn foo [#^Integer x] (+ 3 x)) (.equals (foo 2) (foo 2)) => Reflection warning, NO_SOURCE_PATH:10 - call to equals can't be resolved. t

我试图解决Clojure中的一个反射警告,它似乎是由于对普通Java对象的函数返回值缺乏类型推断而导致的

演示此问题的简单示例代码:

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

(defn foo [#^Integer x] (+ 3 x))

(.equals (foo 2) (foo 2))

=> Reflection warning, NO_SOURCE_PATH:10 - call to equals can't be resolved.
   true

解决这个问题的最好办法是什么?这可以通过类型提示来完成吗?

这两个版本似乎都可以工作:

user> (defn foo [^Integer x] (+ 3 x))
#'user/foo
user> (.equals (foo 2) (foo 2))
Reflection warning, NO_SOURCE_FILE:1 - call to equals can't be resolved.  ;'
true
user> (.equals ^Integer (foo 2) ^Integer (foo 2))
true
user> (defn ^Integer foo [^Integer x] (+ 3 x))
#'user/foo
user> (.equals (foo 2) (foo 2))
true

请注意,在1.2版本之前,Clojure中的类型暗示仍在不断变化,因此这可能不会永远以相同的方式工作。还请注意,
#^
被弃用,取而代之的是
^

您使用的Clojure版本是什么?我在我的Clojure v1.0中尝试了你的例子,它似乎工作得很好……它是Clojure 1.2版本。请注意,警告仅显示为(set!warn on reflection true),这可能是区别。。。。编辑问题以澄清问题,就是这样。我现在看到了。太好了,非常好用。谢谢!了解不断变化的语法也很好。。。生活在最前沿的乐趣我想:-)太棒了!期待使用以下命令加速我的代码:)