2010-08-04 16 views
9

Puedo usar (.toUpperCase "GOOD") en clojure, ya que "GOOD" es java string, y java string tiene el método UpperCase.Llamar a funciones Java desde Clojure

También puedo usar (java.io.File/separator) de clojure como una forma de llamar a las funciones de Java.

Pero, ¿por qué no puedo llamar (java.lang/Object wait 3) o (java.lang.System/println "hi")?

  • ¿No podemos usar todas las funciones de java de Clojure?
  • Si no, ¿hay alguna regla para llamarlos? Si es así, ¿dónde están las referencias para esas funciones?

Respuesta

17

Puede usar todas las funciones de Java de Clojure. Vea la gran página en Clojure's Java interop.

En particular, solo necesita obtener la sintaxis adecuada dependiendo de qué tipo de constructo de Java está tratando, por ej. ejecutar el método println en el miembro estático "fuera" de java.lang.System:

(.println (System/out) "hi") 
+2

Sin problemas, la razón es que el separador es un miembro estático de la clase File, de la misma manera que out es un miembro estático de la clase System. En el caso de impresión, en realidad está encadenando dos construcciones de interpolación de Java, accediendo a System.out, y luego llamando a println al resultado. – mikera

6

Como se ha señalado anteriormente el cartel, los dos ejemplos que se dan sólo un poco apagado:

(.wait (java.lang.Object.) 3) ;; this actually throws an IllegalMonitorStateException 

(.println java.lang.System/out "hi") 

En caso ¡trabajo!

2

Al principio, Object.wait() no es una función estática, se debe utilizar como:

(. .wait (java.lang.Object) 3)

En segundo lugar, Object.wait() debe llamarse a la función después de obtener el bloqueo. De lo contrario, arrojará IllegalMonitorStateException.