在Clojure中输入函数的提示

时间:2010-06-10 21:20:58

标签: 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.
   true

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

1 个答案:

答案 0 :(得分:12)

这两个版本似乎有效:

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

请注意,类型提示在Clojure中仍然有点不稳定,现在导致1.2版本,所以这可能永远不会以相同的方式工作。另请注意,#^已弃用,而不是^