2014-12-08 2 views
0

Я пытаюсь вызвать методы, которые не принимают аргументов в классе Java, но когда я это делаю, я получаю предупреждения об отражении, говорящие, что «ссылка на поле [имя метода] не может быть решены».Вызвать метод экземпляра Java без аргументов в Clojure

В соответствии с этим документы Clojure на Java interop (http://clojure.org/java_interop): «Форма члена экземпляра работает как для полей, так и для методов». Как я могу сказать, что мне нужен метод? Кажется, предполагается, что, поскольку я не передаю аргументы, что я хочу поле.

+0

Как выглядит ваш код? в случайном случае вы не обертываете метод в parens, я уверен, что java будет иметь аналогичную жалобу, если вы указали foo.bar вместо foo.bar() – noisesmith

ответ

2

Если есть оба поля и методы, форма (.member instance) вызовет метод (который является более распространенным). Если вы хотите принудительно получить доступ к полю, форма (.-field instance) будет получать только значение поля.

Если у вас есть пример, который не работает так, как вы ожидаете, было бы полезно увидеть код или ошибку.

Есть некоторые обстоятельства, когда компилятор Clojure не может найти метод (по неизвестному типу экземпляра или типам параметров), сообщение об ошибке указывает, что оно ищет поле, но это всего лишь артефакт порядка, который он оценки параметров. Иногда включение предупреждений о отражении поможет лучше определить проблему.

0

Вот пример. Он создает класс Java - StringBuilder, инициализированный строкой. Затем на него вызывается метод без параметров - reverse - и результаты преобразуются в String путем вызова метода toString.

user=> (def sb (java.lang.StringBuilder. "Hello World")) 
;; #'user/sb 
user=> (.toString (.reverse sb)) 
;; "dlroW olleH" 
user=> (.toString (.reverse sb)) 
;; "Hello World" 
user=> 

StringBuilder объект является изменяемым таким образом он сохраняет свое состояние, в результате, второй обратный откат первый. Это не очень Clojure, поэтому его следует использовать с осторожностью.

Смежные вопросы