документация по Java Interop говорит следующие:
предпочтительном идиоматические формы для доступа к полю или методу членов приведены выше. Форма члена экземпляра работает для обоих полей и методов. Форма instanceField является предпочтительной для полей и обязательна , если существуют одно и однопользовательское поле с одинаковым именем. Они все разворачиваются на вызовы оператору точек (см. Ниже) в времени макроэкспонирования. Расширения являются следующие: (. Classname staticField) ... (Classname/STATICMETHOD арг *) ==> (. Classname STATICMETHOD арг *) Classname/staticField ==>
так что вы должны помните, что Class/fieldName
просто сахар для получения статического поля, ни статического вызова метода, ни ссылка на статический метод (метод Java не является функцией Clojure на самом деле), поэтому нет статического поля parseInt
в Integer class
, тогда как (Class/fieldName arg)
вызывает stati c метод, это две совершенно разные операции, используя аналогичный сахаристый синтаксис.
так, когда вы (map #(Integer/parseInt %) ["1" "2" "3" "4"])
расширяется до
(map #(. Integer parseInt %) ["1" "2" "3" "4"])
(вы можете легко увидеть это сами с macroexpansion),
и (map Integer/parseInt ["1" "2" "3"])
расширяется
(map (. Integer parseInt) ["1" "2" "3"])
It терпит неудачу, когда он пытается получить поле (которое вы t hink получает ссылку на метод).
в дополнение к отличным ответам, которые у вас уже есть - Clojure - довольно тонкая абстракция над jvm, и нет такой вещи, как метод первого класса, поэтому метод не может быть аргументом функции Clojure. То есть, на уровне байтового кода метод не может быть аргументом. – noisesmith