la documentazione java interoperabilità dice il seguente:
Le forme idiomatiche preferiti per accedere membri campo o il metodo sono già stati descritti sopra. Il modulo membro di istanza funziona sia per i campi che per i metodi . Il modulo instanceField è preferito per i campi e richiesto se esiste un campo e un metodo di argomento 0 con lo stesso nome. Essi si espandono tutte in chiamate all'operatore punto (descritto di seguito) al tempo di espansione macro . Le espansioni sono i seguenti: (. Classname staticField) ... (Classname/staticmethod args *) ==> (args. Classname staticmethod *) Classname/staticField ==>
così si dovrebbe ricordate che Class/fieldName
è solo uno zucchero per ottenere una statica campo, né statico chiamata al metodo, nè riferimento al metodo statico (metodo Java non è una funzione clojure davvero), quindi non c'è campo statico parseInt
in Integer class
, mentre (Class/fieldName arg)
chiama uno stato c metodo, sono due operazioni totalmente diverse, utilizzando la sintassi zuccherina simile.
in modo che quando si fa (map #(Integer/parseInt %) ["1" "2" "3" "4"])
si espande per
(map #(. Integer parseInt %) ["1" "2" "3" "4"])
(si può facilmente vedere da soli con macroexpansion),
e (map Integer/parseInt ["1" "2" "3"])
espande per
(map (. Integer parseInt) ["1" "2" "3"])
E ' fallisce quando sta cercando di ottenere un campo (che tu t hink sta ricevendo un riferimento a un metodo).
in aggiunta alle eccellenti risposte che hai già - Clojure è un'astrazione abbastanza sottile sulla jvm, e non esiste un metodo di prima classe, quindi un metodo non può essere un argomento per una funzione Clojure. Cioè, a livello di codice byte, un metodo non può essere un argomento. – noisesmith