Тип подсказки для функций в Clojure

Я пытаюсь разрешить предупреждение отражения в 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

Эти две версии работают:

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

Обратите внимание, что тип hinting по-прежнему немного в потоке в Clojure прямо сейчас, вплоть до версии 1.2, так что это может работать не так. Также обратите внимание, что #^ устарел в пользу ^.