我正在尝试解决 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 中的类型提示仍然在不断变化,因此这可能不会永远以同样的方式工作。另请注意#^
已被弃用,有利于^
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)