2014-10-21 4 views
1

Я пытаюсь следующийClojure новичку, как вызывать методы объекта Java

(def myMap (HashMap.)) 
    (doto (myMap) (.put "a" 1) (.put "b" 2)) 

я получаю в результате:

Reflection warning, core.clj:20:3 - call to method put can't be resolved (target class is unknown). 
Reflection warning, core.clj:20:3 - call to method put can't be resolved (target class is unknown). 

я делаю что-то неправильно?

ответ

3

Вы должны удалить скобки вокруг myMap:

(doto myMap (.put "a" 1) (.put "b" 2)) 

(myMap) попытается вызвать myMap как функцию.

2

Не совсем. Компилятор просто предупреждает вас, что его испускающий код использует отражение. Вы можете ввести подсказку Clojure, чтобы избавиться от этого:

(def ^HashMap myMap (HashMap.)) 
(doto myMap (.put "a" 1) (.put "b" 2)) 

Update: Ха, я не читал сообщение об ошибке очень хорошо :) Тем не менее, как только вы удалите скобки из (myMap) вы получить предупреждение о фактическом отражении (при условии, что (set! *warn-on-reflection* true)), что может быть разрешено моим примером выше.