我正在尝试解决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
解决此问题的最佳方法是什么?这可以通过类型提示来完成吗?
答案 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版本,所以这可能永远不会以相同的方式工作。另请注意,#^
已弃用,而不是^
。