Я пытаюсь разрешить предупреждение отражения в 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
Обратите внимание, что подсказки типов все еще немного изменяются в Clojure прямо сейчас, в преддверии выпуска 1.2, так что это может не работать так же навсегда . Также обратите внимание, что # ^
устарел и заменен на ^
.