2010-08-04 4 views
9

Я могу использовать (.toUpperCase «GOOD») в clojure, так как «GOOD» - это строка java, а строка java имеет метод toUpperCase.Вызов java-функций из Clojure

Я также могу использовать (java.io.File/separator) из clojure как способ вызова java-функций.

Но почему я не могу позвонить (java.lang/Object wait 3) или (java.lang.System/println "hi")?

  • Нельзя использовать все функции java от Clojure?
  • Если нет, есть ли правило для их вызова? Если да, то где ссылки для этих функций?

ответ

17

Вы можете использовать все функции Java из Clojure. Посмотрите великолепную страницу на Clojure's Java interop.

В частности, вам просто нужно получить синтаксис справа в зависимости от того, какую конструкцию Java вы имеете в виду, например. выполнение Println метода на статический член «вне» от java.lang.System:

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

Нет проблем, причина в том, что разделитель является статическим членом класса File, аналогичным тому, что является статическим членом класса System. В случае с println вы фактически объединяете две конструкции Java interop - доступ к System.out, а затем вызов println в результате. – mikera

6

Как отмечалось ранее плакат, два примера, которые вы даете только поодаль:

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

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

Если Работа!

2

Сначала Object.wait() функция не является статической функции, вы должны использовать в качестве:

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

Во-вторых, Object.wait() следует вызвать после того, как вы получите блокировку. В противном случае он выкинет IllegalMonitorStateException.

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