Вызов java-функций из Clojure
Я могу использовать (.toUpperCase "GOOD" ) в clojure, так как "GOOD" - это строка java, а строка java имеет метод toUpperCase.
Я также могу использовать (java.io.File/separator) из clojure как способ вызова java-функций.
Но почему я не могу позвонить (java.lang/Object wait 3) или (java.lang.System/println "привет" )?
- Разве мы не можем использовать все java-функции из Clojure?
- Если нет, есть ли правило для их вызова? Если да, то где ссылка для этих функций?
Ответы
Ответ 1
Вы можете использовать все функции Java из Clojure. См. Замечательную страницу в Clojure Java interop.
В частности, вам просто нужно получить синтаксис права в зависимости от того, какую конструкцию Java вы имеете в виду, например. выполнение метода println на статическом элементе "out" из java.lang.System:
(.println (System/out) "hi")
Ответ 2
Как уже отмечал предыдущий плакат, два примера, которые вы даете, просто немного:
(.wait (java.lang.Object.) 3) ;; this actually throws an IllegalMonitorStateException
(.println java.lang.System/out "hi")
Должен работать!
Ответ 3
Во-первых, функция Object.wait()
не является статической, ее следует использовать как:
(.wait (java.lang.Object.) 3)
Во-вторых, функция Object.wait()
должна вызываться после получения блокировки. В противном случае он выбросит IllegalMonitorStateException
.